我正在编写一个程序,该程序涉及从另一个模块调用的回调,并且需要访问全局变量。
似乎在回调函数中看不到分配给全局变量的更改,它只能看到原始分配。我猜是因为从另一个模块导入。
编写此模式的正确方法是什么?
第一个模块:
# 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 只能调用一次(它是复杂程序的简化)
最佳答案
Python 将主模块导入为 __main__
。当 b.py
按其实际名称导入 a
时,模块的新实例会以 a
名称加载。每个实例都有自己的 myGlobal
。
一种解决方案是这样的:
#b.py
def runb():
from __main__ import callback
callback()
另一种解决方案是创建一个新的主模块。在那里导入
a
并显式调用 a.main()
。关于Python 全局变量和回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23738349/