这是test.py:
import sys
a = 50
b = [1,2]
def change():
print "Here 1"
import test
print "Here 2"
test.a = -1
test.b = [0,1]
return
def main():
print "Here 3"
change()
print "Here 4"
print a, b
if 1:
main()
在系统上运行时,上面的python代码会生成以下输出:
Here 3
Here 1
Here 3
Here 1
Here 2
Here 4
-1 [0, 1]
Here 2
Here 4
50 [1, 2]
我很困惑为什么不存在“Here 1 \ n Here 3”输出的无限循环。如何证明打印a,b输出是否合理?
答案 0 :(得分:14)
当您将文件作为脚本运行时,它不被视为test
模块。它被认为是__main__
模块。
当执行命中import test
时,文件的第二次执行开始,模块被认为是test
。
当执行再次点击import test
时,Python会识别出它已经导入test
并且不会重新执行该模块。相反,它只是将半初始化的test
模块对象加载到当前命名空间中并继续。 Python的乐观假设是您编写了代码,以便在导入完成之前不需要test
的内容。
当执行到达test.a
和test.b
的分配时,它会影响test
模块,但不影响__main__
,尽管它们来自同一个文件。因此,导入模块中的print a, b
会反映新值,而来自print a, b
的{{1}}会反映初始值。
答案 1 :(得分:0)
文件只能导入一次。 “导入测试”行在第一次遇到时成功。当第二次遇到它时,解释器将检查它是否已被加载。
最初运行某个程序时,它不会被视为“已导入”。
答案 2 :(得分:0)
此脚本的一般流程如下:
答案 3 :(得分:0)
虽然user2367112's excellent answer解释了为什么会发生这种情况,但这里的答案都没有提供解决方法。
有两种简单的方法可以达到预期的行为。
test
,而是使用import __main__
。如果您使用import __main__ as test
指定别名,则甚至不需要更改任何其他代码。sys.modules['test'] = sys.modules['__main__']
告诉python“嘿,这个模块已经存在”。在此之后,import test
将不会重新导入模块,从而使您的代码按预期工作。 sys.modules
上的相关文档可以找到here。