为什么只打印了两次Hello?

问题描述 投票:0回答:1

main.py

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

輸出:

Hello
Hello

我相信,当涉及到行 import main,当时。main 注册于 sys.modules 因此,另一个脚本的导入语句 - 我相信,这不属于 __main__ - 是不执行的。谁能告诉我,我的理解是否正确?如果不对,请给个解释。

python module sys
1个回答
6
投票

我们来加一点调试输出。

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'].

这意味着一个规则:尽量不要在你的代码中任何地方导入你正在运行的模块。


1
投票

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


0
投票

因为你是在main里面导入main,所以print语句会被执行两次,这就是python的工作原理。

© www.soinside.com 2019 - 2024. All rights reserved.