我知道可以在Python中的各个模块之间共享全局变量。但是,我想知道这种可能性的程度以及原因。例如,
global_mod.py
x = None
mid_access_mod.py
from global_mod import * class delta: def __init__(self): print x
bot_modif_mod.py
import mid_access_mod import global_mod class mew: def __init__(self): global_mod.x = 5 def main(): m = mew() d = mid_access_mod.delta()
即使所有模块都共享全局变量x,也将打印“无”。为什么会这样呢?似乎x是在mew()分配给bot_modif_mod.py之前在mid_access_mod.py求值的。
发生这种情况是因为您使用的是不可变值(int和None),并且导入变量就像按值传递事物,而不是按引用传递事物。
如果制作了global_mod.xa列表并操纵了它的第一个元素,则它将按预期工作。
完成后from global_mod import x,您将x在模块中创建一个名称,该名称的值与xin中的值相同global_mod。对于函数和类之类的东西,这可以按您期望的那样工作,因为人们(通常)以后不会重新分配这些名称。
from global_mod import x
x
global_mod
正如Alex所指出的,如果您使用import global_mod,然后使用,则global_mod.x可以避免该问题。您在模块中定义的名称将为global_mod,它始终指向您想要的模块,然后使用属性访问获取atx将会为您提供最新值x。
import global_mod
global_mod.x