Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python全局变量和回调_Python - Fatal编程技术网

Python全局变量和回调

Python全局变量和回调,python,Python,我正在编写一个程序,它涉及从另一个模块调用的回调,并且需要访问一个全局变量。 似乎在回调函数中看不到分配给全局变量的更改,它只看到原始分配。我猜是因为从另一个模块导入。 编写此模式的正确方法是什么? 第一模块: # a.py from b import runb myGlobal=None def init(): global myGlobal myGlobal=1 def callback(): print myGlobal def main(): in

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

第一模块:

# 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只能调用一次(它是一个复杂程序的简化)

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

如果执行此操作,“从导入回调”,则再次执行“myGlobal=None”,以打印“None”

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

一个解决方案是:

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

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

,但我确实直接运行了a.py…这不是真的,我把它与包的
\uuuu init\uuuuuuuuu.py
脚本混淆了。对不起,假设a.py是主模块。我刚刚运行了:python a.pySo我可以在不进行任何初始化的情况下定义全局变量吗?这样行吗?如果是,怎么做?你知道最好避免循环依赖:@Scorpion\u God:这个链接讨论的是包之间的依赖关系,而不是模块之间的依赖关系。我知道一般情况下最好避免循环依赖,但有时替代方案不是很好。