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点后
主要-之前:20
func2:20
func1:10
主-20点后
“ var”是全局变量。我希望当我更改var的值时,无论变量’var’出现在哪里,它都会被更改。func1和func2之间的唯一区别是func1在另一个模块中。仍然,我不明白为什么func1和func2之间的’var’值不同。
python中没有真正的全局变量。对象被绑定到命名空间中的变量,并且global关键字引用当前 模块的 命名空间。from somemodule import *在当前模块的名称空间中创建新变量,并将它们引用到 somemodule 的对象。现在,您有两个不同的变量指向同一个对象。如果您重新绑定其中一个变量,则其他变量将继续引用原始对象。此外,function.s的“全局”命名空间是在其定义的模块,即使将其导入到其他模块也是如此。
global
from somemodule import *
如果需要“全局”变量,请导入模块并使用其名称空间限定名称,而不是在本地名称空间中重新绑定各个变量。
这是一个带注释的示例…
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