两个文件,file1.py,file2.py。有人可以解释一下为什么行1.8将显示垃圾邮件== 1而不是垃圾邮件== 2吗?我已经阅读了所有的python循环导入文章,但是我仍然不明白这一点。另外,我不明白为什么从file2导入时再次从头开始解释file1。我当时印象中,一旦导入模块,就不会再次加载它们。
# file1.py
print('1.1: initializing spam to 0')
spam = 0
spam += 1
print('1.4: spam == {}'.format(spam))
print('1.5: importing file2')
import file2
print('1.7: imported file2')
print('1.8: spam == {}'.format(spam)) # why 1 and not 2?
print('FILE 1 PARSED') # why is this executed twice?
# file2.py
print('\t\t\t2.1: importing file1')
import file1
print('\t\t\t2.3: imported file1, file1.spam == {}'.format(file1.spam))
file1.spam += 1
import file1
print('\t\t\t2.6: print from file2: file1.spam == {}'.format(file1.spam))
print('\t\t\tFILE 2 PARSED')
我得到的输出是这样的:
1.1: initializing spam to 0
1.4: spam == 1
1.5: importing file2
2.1: importing file1
1.1: initializing spam to 0
1.4: spam == 1
1.5: importing file2
1.7: imported file2
1.8: spam == 1
FILE 1 PARSED
2.3: imported file1, file1.spam == 1
2.6: print from file2: file1.spam == 2
FILE 2 PARSED
1.7: imported file2
1.8: spam == 1
FILE 1 PARSED
PS。我赞赏应避免循环导入,但我需要了解逻辑。
Python导入或多或少
如果执行file1
,将会发生的情况是执行从主程序开始
file1
代码导入file2
:由于不存在,因此创建了模块对象并file2
开始执行file2
代码导入file1
:由于file1
不存在于模块中,因此创建了模块对象并file1
开始执行(作为模块!)file1
代码(作为模块)导入file2
:该模块已经存在,因此部分构造的file2
模块对象将立即返回file1
作为模块完成执行并file2
在导入后恢复file2
模块完成执行,并在导入后恢复file1
主程序换句话说,将有两个实例spam
:一个在“主程序” file1.py中,一个在模块中 file1
。
考虑以下简化的测试用例:
# p1.py
import p2, sys
p1d = {}
print id(p1d), id(sys.modules['p1'].p1d)
# p2.py
import p1
print "HERE"
运行p1.py
你会得到类似的输出
18465168 18465168
HERE
17940640 18465168
前两个数字相等,因为它们print
是从p1
模块执行的,而后两个数字是不同的,因为print
是从p1
主程序执行的,这是一个不同的实例。
PS:如果您故意编写执行此操作的代码(即,一个间接将自身的另一个实例作为模块导入的主体),则应将其放入监狱:-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句