Python全局变量和回调

时间:2014-05-19 12:55:35

标签: python

我编写的程序涉及从另一个模块调用的回调,并且需要访问全局变量。
似乎在回调函数中看不到分配给全局变量的更改,后者只能看到原始赋值。我猜是因为从其他模块导入了。
写这种模式的正确方法是什么?

第一个模块:

# a.py
from b import runb

myGlobal=None

def init():
    global myGlobal
    myGlobal=1

def callback():
    print myGlobal

def main():
    init()
    runb()

if __name__=='__main__':
    main()

第二个模块:

#b.py
def runb():
    from a import callback
    callback()

我希望这个程序可以打印' 1',而是打印'无'

编辑: init只能被调用一次(它是复杂程序的简化)

3 个答案:

答案 0 :(得分:4)

Python将主模块导入为__main__。当b.py按其实际名称导入a时,将在名称a下加载模块的新实例。每个实例都有自己的myGlobal

一个解决方案就是:

#b.py
def runb():
    from __main__ import callback
    callback()

另一种解决方案是创建一个新的主模块。在那里导入a并明确调用a.main()

答案 1 :(得分:2)

如果你这样做,"来自导入回调",那么再次" myGlobal = None"将被执行,使其打印"无"

答案 2 :(得分:1)

将文件作为模块导入时,不会调用main()函数。 __name__ == "main"仅在直接执行a.py时才为真。