Python 全局变量在不同的函数中是不同的

Python 全局变量在不同的函数中是不同的,python,django,multithreading,python-2.7,global-variables,Python,Django,Multithreading,Python 2.7,Global Variables,我知道在函数中使用全局变量是错误的,但我有一个使用这些变量的代码,我有一个问题,我找不到如何解决 我有一个模块,代码如下: messages = {} def MessageReceived(message): global messages print messages msgNumber = message[0] if messages.has_key(msgNumber): messageData = messages.pop(msgNu

我知道在函数中使用全局变量是错误的,但我有一个使用这些变量的代码,我有一个问题,我找不到如何解决

我有一个模块,代码如下:

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”从全局字典获取特定消息的回调并调用它

问题是这里似乎有两种不同的词典

当我发送消息时,我看到字典在增长(每次我发送消息时都会向字典中添加一条新记录),但“MessageReceived”函数的打印总是显示一个空字典

你能帮我吗?这里的虫子在哪里


谢谢

首先,尽管它不会影响您的问题,但无需在此代码中的任何位置使用
global
关键字。您永远不会重新分配全局dict,您只会对它们进行变异,因此不需要将它们声明为全局dict—Python无论如何都会在模块范围内找到它们

但问题是所有模块级变量都是每个进程的。如果receive函数总是在自己的线程中运行,它将永远看不到视图中的任何数据


既然你已经知道使用全局变量是不好的,我不知道你为什么要这么做。有很多方法可以在进程之间传递数据;如果您使用Django,将其存储在数据库中可能是最好的。

您的代码不是一个好代码,因此不容易对其进行测试。但是全局的
消息是一个列表,而不是一个命令;它应该是
messages={}
。FWIW,一个比使用全局共享数据更好的方法是创建一个类。你能发布一些关于如何调用它的详细信息吗?
send
方法做什么?你确定你是多线程的吗?如果您使用多处理,则不会共享全局函数。我希望这些函数在单个请求中调用。否则全局变量就没什么意义了(它们在每个请求上都被初始化)。这里使用[]而不是{}。我修好了。我删除了代码中不相关的部分,但仍然包含了一些,只是为了提供必要的背景。发送和接收是在串行COM端口上工作的。此代码是django应用程序的一部分,该应用程序在串行端口启动时对其进行初始化。django视图调用“SendMessage”函数(作为用户请求的结果)。接收由另一个线程调用,该线程从COM端口无限读取数据。