if __name__ == "__main__": 和 Python 中的递归 [重复]
Posted
技术标签:
【中文标题】if __name__ == "__main__": 和 Python 中的递归 [重复]【英文标题】:if __name__ == "__main__": and recursion in Python [duplicate] 【发布时间】:2021-12-25 03:48:03 【问题描述】:我对 Python 中的 if __name__ == "__main__":
感到困惑,并在 SO 上遇到了同样的问题:What does if name == "main": do?
感谢Mr Fooz 投票最多、最详细、最有帮助的answer,我的理解有所提高。但是,我仍然对同一答案中的其中一个代码块感到困惑:
foo3.py
:
注意:我放了一个快照而不是代码块,因为它有行号。通过这些,我想我可以正确地解释我现在的理解是什么,我的困惑是什么!
据我了解,在运行python3 foo3.py
:
-
打印
t1
(第14行)
打印t2
致电functionA
打印a1
作为模块调用foo3
(第6行)
所以,再次打印t1
再次打印“m1”
再次致电functionA
再次打印a1
再次将foo3
作为模块调用
...
...
所以,基本上,一个永无止境的t1 ... m1 ... a1 ...
:
t1
m1
a1
t1
m1
a1
t1
m1
a1
.
.
.
我期待如此无限的输出,因为foo3.py
中没有__name__ == "__main__"
签入,并且它不断在functionA
中调用自己。
但是,当我运行此代码时,我得到以下有限输出:
t1
m1
a1
t1
m1
a1
a2
b
a3
m2
t2
a2
b
a3
m2
t2
我还是不明白为什么!?不应该有无限输出吗?谁能解释一下上面代码sn-p中的程序顺序?
【问题讨论】:
多次导入同一个文件不会重新运行代码。 【参考方案1】:一个模块只创建一次。第二个和后续的导入实际上并没有做任何事情:模块已经创建并存储在 sys.modules
中,名称 foo3
只是(重新)绑定到该模块。
import
不会“调用”模块;它只是使其在当前范围内可用,并在必要时创建模块作为副作用。
一个微妙之处是有两个不同的模块,这两个模块都由 文件 foo3.py
定义。运行脚本时,会创建一个名为 __main__
的模块。 第一次时间from foo3 import functionB
被执行,一个名为foo3
的新模块被创建。但是functionA
执行的后续import
语句将看到foo3
已经创建。
【讨论】:
但是在这种情况下,第一次在foo3.py
中导入foo3
本身(即在foo3.py
的一个函数中)根本不应该调用foo3
,对吧?我更像是一个 C++ 人,所以我在这里仍然有点困惑!我在想“functionA
调用 foo3 的导入”和后来的“functionA
的调用 foo3 试图再次调用 foo3”是两个不同的事物/实例。
有两个不同的模块,都使用文件foo3.py
定义。第一个 __main__
是在您将 foo.py
作为脚本运行时创建的。第二个 foo3
是在您第一次尝试导入 foo.py
时创建的。
我明白了。因此,在运行 foo3.py
、__name__ = __main__
但在所有后续导入中,__name__ = foo3
这就是跟踪模块的方式,对吗?这与在没有此类跟踪的函数中调用相同的函数(即递归)不同,不是吗?如果我错了,请纠正我。感谢您的回答、时间和评论!
正确;没有“递归”导入,因为如果在sys.modules
中已经找到名为foo3
的模块,import
语句不会读取或执行foo3.py
的内容。以上是关于if __name__ == "__main__": 和 Python 中的递归 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
if __name__ == "__main__": 做啥?
unittest: if __name__ == "__main__" 理解
python if __name__ == "__main__"
if __name__ == "__main__" 语法错误