Python中模块内全局变量的异步行为

0 投票
1 回答
800 浏览
提问于 2025-04-16 18:47

我有一个全局变量的模块,叫做 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 文件时创建的,另一个是在其他模块通过名字导入时创建的,这样会生成一个新的模块,里面有你所有代码和数据的重复副本)。还有一种可能性是,虽然非常不常见,你的电脑内存可能出现故障,导致不正确和不可预测的行为。

设置一个属性总是会设置它(或者至少会调用负责设置它的特殊方法——你可能会重写这个特殊方法,让它不设置属性,但那就是你自己的问题了。:)

除此之外,像这样使用“全局变量模块”其实是个坏主意,如果你想创建易于理解、维护和测试(并且能正常工作的)软件。这就像是“远程的神秘作用”。你根本不知道每次设置这些变量时会影响程序的其他部分。与其这样,不如把参数传递给每个函数。让每个函数的定义包含它完成工作所需的所有状态。如果你有很多状态,不喜欢长长的参数列表,可以考虑创建对象来保存这些状态,并给这些对象添加方法。

撰写回答