2015-09-06 79 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。