为什么 Hello 只打印两次?

Why is Hello printed only two times?

main.py

#main.py
import main
print('Hello')

输出:

Hello
Hello

我相信当涉及到行 import main 时,main 已在 sys.modules 中注册,因此另一个脚本的导入语句 - 我相信,它不是 __main__ 的一部分 - 没有被执行。有人可以告诉我我是否理解正确吗?如果不是,请给出解释。

由于您在 main 中导入 main,所以打印语句执行了两次,这就是 python 的工作方式

让我们添加一点调试输出:

import sys
print([key for key in sys.modules.keys() if 'main' in key])
import main

它打印:

['__main__']
['__main__', 'main']

这是为什么?

如果您 运行 一个模块,它将 不会 作为其模块名称添加到 sys.modules。相反,它将始终是 __main__.

如果您随后按名称导入模块 (main)。 sys.modules 中不存在该名称,因此将再次导入该模块,执行其代码,并将模块存储在 sys.modules 中的名称下。

在执行 main.py 时它会打印 ['__main__'] 并且在重新导入时它会打印两个模块名称:['__main__', 'main'].

这暗示了一个规则:尽量不要在代码中的任何地方导入您正在使用的模块。运行

它只打印两次,因为一个模块实际上只加载了一次。这可以防止可能的未绑定递归。所以你的打印语句被导入模块执行一次,主程序执行一次。