繁体   English   中英

为什么这不会陷入无限循环?

[英]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


它不会进入无限循环的原因是, importsys.modules查找具有给定名称的模块-如果该模块已经存在,它将不执行任何新文件。 启动后,Python将在sys.modules__main__创建一个条目,启动脚本的代码( foo3.py )在此模块的范围内执行。

然后,当执行语句import foo3 ,它将检查foo3sys.modules是否具有条目。 由于不存在,因此创建了一个名为foo3空模块,并将其放入sys.modules ,并且在此新空模块的范围内执行foo3.py的代码。

最终它将第二次执行import 这时候 foo3sys.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM