我编写的程序涉及从另一个模块调用的回调,并且需要访问全局变量。
似乎在回调函数中看不到分配给全局变量的更改,后者只能看到原始赋值。我猜是因为从其他模块导入了。
写这种模式的正确方法是什么?
第一个模块:
# 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只能被调用一次(它是复杂程序的简化)
答案 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
时才为真。