Python全局变量实例化两次
在我的项目中,我尝试在模块之间共享一个全局变量,如Python文档中所述: 然而,我似乎发现全局变量被实例化了两次,我不知道为什么。我希望变量是一个单例变量 我能够用这个最小的例子重现这个问题:Python全局变量实例化两次,python,scope,global-variables,Python,Scope,Global Variables,在我的项目中,我尝试在模块之间共享一个全局变量,如Python文档中所述: 然而,我似乎发现全局变量被实例化了两次,我不知道为什么。我希望变量是一个单例变量 我能够用这个最小的例子重现这个问题: #main.py 类别类别: 定义初始化(自): 打印(“初始化类”) def do_工作(自我): 进口工人 工人,干活儿 _类:TheClass=TheClass() 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 班上做作业 #worker.py 从mai
#main.py
类别类别:
定义初始化(自):
打印(“初始化类”)
def do_工作(自我):
进口工人
工人,干活儿
_类:TheClass=TheClass()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
班上做作业
#worker.py
从main导入_类
def do_work():
打印(“正在工作…”)
python main.py的输出:
init TheClass
init TheClass
doing work...
“init TheClass”记录了两次,这意味着该类被实例化了两次
我无法在交互式Python shell中重现此行为:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import main
init TheClass
>>> main.the_class.do_work()
doing work...
>>>
如何修复这种不希望出现的行为?之所以发生这种情况,是因为您正在进行循环导入,并且实际启动的代码文件中发生了一些特殊情况 如果启动一个文件(作为
python
的参数),它将成为独立于文件名的\uuuuu主模块。如果在以后某个时间点导入同一个文件,则不会将其识别为已导入,而是以其真实名称重新导入,在您的情况下为main
。这就是代码运行两次的原因。第三次导入将不会重新运行代码
您可以通过阻止循环导入(不要将要导入的内容放入初学者)或将不应运行两次的代码放入名称检查(如果您已经有了),来修复它。当您从外部执行main.py
时创建一个实例,另一个是当worker.py
从main导入_类时。这是因为您有循环依赖关系main
运行,初始化该类,然后执行工作
运行,导入工作者
,然后工作者
导入main
,这会导致再次执行整个文件,从而创建另一个该类
。你真的需要这种循环性质吗?