我知道在函数中使用全局变量是错误的,但我有一个使用这些变量的代码,我有一个问题,我找不到如何解决。
我有一个包含以下代码的模块:
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"函数总是显示一个空字典。
你可以帮帮我吗?这里的错误在哪里?谢谢!
答案 0 :(得分:2)
首先,虽然它不会影响您的问题,但无需在此代码中的任何位置使用global
关键字。你永远不会重新分配全局dicts,你只需要改变它们,所以不需要将它们声明为全局 - 无论如何Python都会在模块范围内找到它们。
但问题是所有模块级变量都是每个进程。如果您的接收函数始终在自己的线程中运行,它将永远不会从视图中看到任何数据。
因为你已经知道使用全局变量很糟糕,我不确定你为什么要这样做。有很多方法可以在进程之间传递数据;如果你使用Django,将它存储在数据库中可能是最好的。