不同模块之间的全局变量

4

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

程序输出:

main - before: 20

func2: 20

func1: 10

main - after 20

"var"是全局变量。我期望一旦我改变"var"的值,它会在任何出现"var"变量的地方被改变。func1和func2唯一的区别就是func1在另一个模块中。仍然不明白为什么"var"的值在func1和func2之间不同。

1
如果您想要在模块之间使用全局变量 http://stackoverflow.com/a/29702401/2141635 - Padraic Cunningham
如果你的架构或软件设计需要模块之间存在循环依赖,请尝试重新思考它。 - das-g
1个回答

5
在Python中,不存在真正的全局变量。对象绑定在命名空间中的变量上,而“global”关键字是指当前模块的命名空间。使用“from somemodule import *”会在当前模块的命名空间中创建新的变量,并将它们引用到“somemodule”的对象上。现在你有两个不同的变量指向同一个对象。如果重新绑定其中一个变量,则其他变量仍然引用原始对象。此外,函数的“全局”命名空间是定义它的模块,即使它被导入到另一个模块中。
如果您想要一个“全局”变量,请导入模块并使用其命名空间限定名称,而不是重新绑定本地命名空间中的单个变量。
以下是一个带注释的示例...
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

当我们使用“import somemodule”时会发生什么? 在这种情况下,我们不会创建一个指向相同对象的新变量,因此我们只是使用在原始模块中创建的相同变量,这正确吗? - CrazySynthax
@CrazySyntax - 没错。导入会创建一个对_somemodule_的新引用。模块是全局变量的容器(在内部,模块命名空间是_dict_),因此通过模块引用变量的每个人都看到相同的变量。如果重新分配变量(somemodule.var =“new value”),则所有引用somemodule.var的代码都将看到相同的变量,从而看到新值。 - tdelaney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接