2015-09-06 33 views
0

我知道在函數中使用全局變量是錯誤的,但是我有一個使用這些變量的代碼,我有一個問題,我找不到如何解決。全局變量在不同的函數中有所不同

我用下面的代碼的模塊:

messages = {} 

def MessageReceived(message): 
    global messages 

    print messages 
    msgNumber = message[0] 
    if messages.has_key(msgNumber): 
     messageData = messages.pop(msgNumber) 
     ReleaseMessageNumber(msgNumber) 
     if messageData["callback"] is not None: 
      messageData["callback"](messageData["originalMessage"]) 

def SendMessage(message, callBack): 
    global messages 

    msgNumber = GetMessageNumber() 

    messageToSend = msgNumber + message + "\0" 

    messages[msgNumber] = { 'originalMessage' : message, 'time' : time.time(), 'callback' : callBack } 
    print messages 
    Send(messageToSend) 

    return True 

一般來說,函數「SendMessage消息」建立與消息號的消息,發送該消息的存儲的消息和回叫在全球字典。

函數「MessageReceived」從全局字典中獲取特定消息的回調並調用它。

問題是這裏似乎存在2個不同的字典。

當我發送消息時,我發現字典增長(每次發送消息時都會向字典添加新記錄),但「MessageReceived」函數的打印總是顯示空字典。

你能幫我嗎?這裏的錯誤在哪裏?

謝謝!

+1

您的代碼不是[MCVE],因此測試它並不容易。但是全球的「訊息」是一個列表,而不是一個字典;它應該是'messages = {}'。 FWIW,比使用全球共享數據更好的方法是創建一個類。 –

+0

你可以發佈更多的細節周圍如何被稱爲? send方法有什麼作用?你確定你是多線程的嗎?如果你使用多處理,那麼全局變量不會被共享。 –

+0

我希望在一個請求中調用這些函數。否則,全局變量沒什麼意義(它們會根據每個請求進行初始化) – Pynchia

回答

2

首先,雖然它不會影響您的問題,但無需在此代碼中的任何位置使用global關鍵字。你永遠不會重新分配全局的字典,你只會改變它們,所以不需要將它們聲明爲全局的 - Python無論如何都會在模塊範圍內找到它們。

雖然問題是所有模塊級別的變量都是每個進程。如果您的接收函數始終在其自己的線程中運行,它將永遠不會從視圖中看到任何數據。

因爲不管你已經知道使用全局變量不好,我不知道你爲什麼這樣做。在進程之間傳遞數據有很多方法。將它存儲在數據庫中可能是最好的,如果你使用Django。

相關問題