python中具有intra模块全局变量的异步全局变量行为

时间:2011-06-01 18:35:15

标签: python global-variables

所以我有一个全局变量模块global_var.py,如下所示:

x = 1
y = 2

当我想访问这些变量时,我可以做这样的事情:

import global_var

# read var
print global_var.x
# change var
global_var.x = 0

我注意到有时候如果我更改一个全局变量并立即尝试读取它,那么有时我会得到旧的值。例如

import global_var

global_var.x = 'new'
if global_var.x == 'new':
    print 'changed'
else:
    print 'not changed'

上述操作似乎是异步性的概率。那么,有什么办法可以使这种事情具有确定性,或者我应该不这样做?


好的,我发现了我的bug,python仍然有效并且和以前一样同步,一切都很好,感谢每个人的时间和建议。

1 个答案:

答案 0 :(得分:3)

如果您正在做您说过的事情,那么您所描述的行为不会发生。仔细检查你的代码,也许在你认为你做的某些情况下你实际上没有设置新的值;或者你有时候在写作之前读过;或者你可能有线程,读写的确切顺序是不确定的。如果你的全局变量实际上在你的__main__模块中(也就是你在命令行上执行的.py文件),那么你可能有两个副本(当.py文件变成了__main__模块,因为您在命令行上运行它;当另一个模块按名称导入时创建第二个副本,创建一个新模块,其中包含所有代码和数据的副本)。作为非常不太可能的替代方案,可能是您计算机中的内存失败并导致不正确,不可预测的行为。

设置一个属性总是设置它(或至少调用负责设置它的特殊方法 - 你可能会覆盖这个特殊方法而不是因某种原因设置它,但那就是你的错。:)

除此之外,如果你想创建可理解的,可维护的,可测试的(工作)软件,那么使用像这样的“全局变量模块”是一个坏主意。这是一种“远距离的怪异行为”。谁知道在设置其中一个变量时,您的程序的其他部分会受到影响。而不是这种模式,将参数传递给每个函数。使每个函数的签名包括它完成工作所需的所有状态。如果你有很多状态并且不喜欢长参数签名,那么考虑使对象保持该状态并向这些对象添加方法。