[英]Why does this not run into an infinite loop?
这段代码是从这个线程的一个答案中提取的, 如果 __name__ == "__main__": do?
# Suppose this is foo3.py.
def functionA():
print("a1")
from foo3 import functionB
print("a2")
functionB()
print("a3")
def functionB():
print("b")
print("t1")
print("m1")
functionA()
print("m2")
print("t2")
我认为代码执行如下(当作为主python3 foo3.py执行时):
1. 打印 t1
2. 打印 m1
3.输入functionA并打印a1
4. 从 foo3 导入 functionB,从而再次运行 foo3。 回到步骤 1
你能帮我纠正我的分析吗?
它不会“再次运行foo3
”,而是再次运行foo3.py
脚本。 第一次运行foo3.py
是生成模块__main__
,第二次运行是生成模块foo3.py
该行为实际上是(几乎),如果你有一个文件名为__main__.py
,另一个名为foo3.py
都与这些完全相同的内容,你再运行python __main__.py
。 这就是正在发生的事情。
只是,Python伪造了它,因此无论实际的Python文件是什么, 它看起来都好像程序是从名为 __main__.py
的脚本启动的 。 唯一相反的迹象是__file__
会告诉实际脚本的文件名,即/spam/ham/eggs/foo3.py
。
它不会进入无限循环的原因是, import
在sys.modules
查找具有给定名称的模块-如果该模块已经存在,它将不执行任何新文件。 启动后,Python将在sys.modules
为__main__
创建一个条目,启动脚本的代码( foo3.py
)在此模块的范围内执行。
然后,当执行语句import foo3
,它将检查foo3
在sys.modules
是否具有条目。 由于不存在,因此创建了一个名为foo3
的新空模块,并将其放入sys.modules
,并且在此新空模块的范围内执行foo3.py
的代码。
最终它将第二次执行import
。 这时候有 foo3
在sys.modules
,所以进口不会创建或加载任何多个脚本,只是返回已经加载的模块。
要获取“无限”循环,可以在再次导入foo3
之前从sys.module
删除已导入的模块引用:
import sys
def functionA():
print("a1")
if 'foo3' in sys.modules:
del sys.modules['foo3']
from foo3 import functionB
print("a2")
functionB()
print("a3")
def functionB():
print("b")
print("t1")
print("m1")
functionA()
print("m2")
print("t2")
而当您运行时,您会得到
[....]
File ".../foo3.py", line 7, in functionA
from foo3 import functionB
File ".../foo3.py", line 17, in <module>
functionA()
File ".../foo3.py", line 7, in functionA
from foo3 import functionB
RuntimeError: maximum recursion depth exceeded while calling a Python object
如果只是从中导入函数,为什么还要运行foo3?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.