Python中模块内全局变量的异步行为
我有一个全局变量的模块,叫做 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'
这个操作看起来是因为异步性而表现得有些随机。那么这是怎么回事呢?有没有办法让这种情况变得可预测,或者我干脆就不要这样做?
好的,我找到了我的错误,Python 依然是同步的,一切都很好,感谢大家的时间和建议。
1 个回答
3
你描述的情况其实不应该发生,如果你只是按照你说的那样做。建议你再仔细检查一下代码,可能在某些情况下你并没有真正设置新的值,或者你在写之前就读取了值;也有可能是你在使用多线程,导致读取和写入的顺序是不可预测的。如果你的全局变量实际上是在你的 __main__
模块里(也就是你在命令行执行的 .py 文件),那么可能你有两个副本(一个是在你运行 .py 文件时创建的,另一个是在其他模块通过名字导入时创建的,这样会生成一个新的模块,里面有你所有代码和数据的重复副本)。还有一种可能性是,虽然非常不常见,你的电脑内存可能出现故障,导致不正确和不可预测的行为。
设置一个属性总是会设置它(或者至少会调用负责设置它的特殊方法——你可能会重写这个特殊方法,让它不设置属性,但那就是你自己的问题了。:)
除此之外,像这样使用“全局变量模块”其实是个坏主意,如果你想创建易于理解、维护和测试(并且能正常工作的)软件。这就像是“远程的神秘作用”。你根本不知道每次设置这些变量时会影响程序的其他部分。与其这样,不如把参数传递给每个函数。让每个函数的定义包含它完成工作所需的所有状态。如果你有很多状态,不喜欢长长的参数列表,可以考虑创建对象来保存这些状态,并给这些对象添加方法。