我有这4个模块
全局.py
globvara = "a"
mod1.py
from globals import *
print globvara
输出:
a
mod2.py
from mod1 import *
def changegv(newval1):
#global globvara
globvara = newval1
def usechangegv(newval2):
changegv(newval2)
和mod3.py
from mod2 import *
usechangegv("b")
print globvara
输出:
a
a
我想知道为什么模块 2 中的全局变量没有改变。我在全局变量中遗漏了一些东西。即使我取消注释
global globvara
行,我也会得到相同的结果。哪里出错了?
Python 全局变量仅对模块是全局的。当您从另一个模块导入变量时(例如
from mod1 import *
),Python 会创建对导入模块中的值的 duplicate 引用。因此,您现在有两个名称,mod1.globvara
和 mod2.globvara
,它们最初指向相同的值,但没有以任何方式连接。如果您在 globvara
中更改 mod2.py
,则您正在更改 mod2.globvara
,并且 mod1.globvara
不受影响。
为了避免此问题,请导入模块,而不是其中定义的各个名称。 例如,
import globals
。 然后始终参考 globals.globvara
(或者更好,globals.a
)。由于您始终访问和分配相同的名称,因此它将按照您期望的方式工作。
请勿使用
from <module> import <variable>
因为它创建了变量的副本。
做一个简单的:
import <module>
所有对全局变量的访问都应该使用“模块”中的“变量”:
<module>.<variable> = ...
或
print <module>.<variable>