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__" 语法错误

if __name__ == "__main__": 和 Python 中的递归 [重复]

if __name__=="__main__"作用