main.py:
from module import *
var=10
def func2():
print "func2:" ,var
def main():
global var
var=20
print "main - before", var
func2()
func1()
print "main - after", var
if __name__=='__main__':
main()
module.py
from main import *
def func1():
global var
print "func1:", var
程序打印:
主要 - 之前:20
func2:20
func1:10
主要 - 20后
'var'是一个全局变量。我希望在我改变var值的那一刻,它会在变量'var'出现的地方改变。 func1和func2之间的唯一区别是func1在另一个模块中。不过,我不明白为什么'var'的值在func1和func2之间是不同的。
答案 0 :(得分:2)
在python中没有真正的全局变量。对象绑定到名称空间中的变量,global
关键字引用当前的模块名称空间。 from somemodule import *
在当前模块的命名空间中创建新变量,并将它们引用到 somemodule 的对象。您现在有两个指向同一对象的不同变量。如果重新绑定其中一个变量,其他变量将继续引用原始对象。此外,还有一个函数。" global" namespace是它定义的模块,即使它被导入到不同的模块。
如果你想要"全球"变量,导入模块并使用其名称空间限定名称,而不是在本地名称空间中重新绑定单个变量。
这是一个带注释的例子......
cfg.py
var = 10
somelist = []
var2 = 1
def show_var2():
print var2
main.py
import cfg
from cfg import * # bind objects referenced by variables in cfg to
# like-named variables in this module. These objects
# from 'cfg' now have an additional reference here
if __name__ == '__main__':
print cfg.var, var
var = 20 # rebind this module's 'var' to some other value.
# this does not affect cfg's 'var'
print cfg.var, var
print '----'
print cfg.somelist, somelist
somelist.append(1) # update this module's 'somelist'
# since we updated the existing object, all see it
print cfg.somelist, somelist
print '----'
var2 = 2
print var2, cfg.var2, show_var2() # show_var2 is in cfg.py and uses its
# namespace even if its been imported
# elsewhere