Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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_Scope_Global Variables - Fatal编程技术网

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

在我的项目中,我尝试在模块之间共享一个全局变量,如Python文档中所述:

然而,我似乎发现全局变量被实例化了两次,我不知道为什么。我希望变量是一个单例变量

我能够用这个最小的例子重现这个问题:

#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
,这会导致再次执行整个文件,从而创建另一个
该类
。你真的需要这种循环性质吗?