不同模块之间的全局变量

Cra*_*hax 4 python methods module global

主要.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()
Run Code Online (Sandbox Code Playgroud)

模块.py

from main import *

def func1():
    global var
    print "func1:", var
Run Code Online (Sandbox Code Playgroud)

程序打印:

主要 - 之前:20

功能2:20

功能1:10

主要 - 20后

'var' 是一个全局变量。我希望当我改变 var 的值时,无论变量“var”出现在哪里,它都会改变。func1 和 func2 之间的唯一区别是 func1 在另一个模块中。不过,我不明白为什么 func1 和 func2 之间“var”的值不同。

tde*_*ney 5

python 中不存在真正的全局变量。对象绑定到命名空间中的变量,global关键字引用当前模块命名空间。from somemodule import *在当前模块的命名空间中创建新变量并将它们引用到某个模块的对象。现在有两个不同的变量指向同一个对象。如果重新绑定其中一个变量,其他变量将继续引用原始对象。此外,函数的“全局”命名空间是定义它的模块,即使它被导入到不同的模块。

如果您想要一个“全局”变量,请导入模块并使用其命名空间限定名称,而不是重新绑定本地命名空间中的各个变量。

这是一个带注释的示例...

cfg.py

var = 10
somelist = []
var2 = 1

def show_var2():
    print var2
Run Code Online (Sandbox Code Playgroud)

主要.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
Run Code Online (Sandbox Code Playgroud)