不同模块之间的全局变量

发布于 2021-01-29 15:00:02

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在另一个模块中。仍然,我不明白为什么func1和func2之间的’var’值不同。

关注者
0
被浏览
81
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

    这是一个带注释的示例…

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看