【问题标题】:if __name__ == "__main__": and recursion in Python [duplicate]if __name__ == "__main__": 和 Python 中的递归 [重复]
【发布时间】: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

  1. 打印t1(第14行)
  2. 打印t2
  3. 致电functionA
  4. 打印a1
  5. 作为模块调用foo3(第6行)
  6. 所以,再次打印t1
  7. 再次打印“m1”
  8. 再次致电functionA
  9. 再次打印a1
  10. 再次将foo3 作为模块调用
  11. ...
  12. ...

所以,基本上,一个永无止境的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中的程序顺序?

【问题讨论】:

  • 多次导入同一个文件不会重新运行代码。

标签: python recursion main python-module idioms


【解决方案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 的内容。
猜你喜欢
  • 2014-05-24
  • 2011-06-26
  • 2015-04-04
  • 2011-06-09
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多