在python中循环导入

坦诚

两个文件,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。我赞赏应避免循环导入,但我需要了解逻辑。

6502

Python导入或多或少

  1. 查看是否已经有一个具有该名称的模块,如果有,立即返回
  2. 该模块尚未导入,因此创建模块对象并将其立即放入注册表中,然后加载源并执行它

如果执行file1将会发生的情况是执行从主程序开始

  1. file1代码导入file2:由于不存在,因此创建了模块对象并file2开始执行
  2. file2代码导入file1:由于file1不存在于模块中,因此创建了模块对象并file1开始执行(作为模块!)
  3. file1代码(作为模块)导入file2:该模块已经存在,因此部分构造的file2模块对象将立即返回
  4. file1作为模块完成执行并file2在导入后恢复
  5. file2模块完成执行,并在导入后恢复file1 主程序
  6. 程序完成

换句话说,将有两个实例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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 Python 中循环导入字典

来自分类Dev

python中的循环和嵌套导入

来自分类Dev

python中的循环和嵌套导入

来自分类常见问题

Python循环导入?

来自分类Dev

Python上的循环导入

来自分类Dev

从python Django中的导入模块中导入当前模块(导入循环)

来自分类Dev

Python中的While循环和Fibonacci(无需导入或使用“ fib”)

来自分类Dev

Python - 从导入的文件中读取时循环打印太多次

来自分类Dev

Python导入错误。循环进口

来自分类Dev

Python导入错误。循环进口

来自分类Dev

Python循环相对导入在python 3中工作但在python 2中不工作

来自分类Dev

导入后的for循环在Python一线式中不起作用

来自分类Dev

导入后的for循环在Python一线式中不起作用

来自分类Dev

Python:如何通过循环导入在另一个文件中调用函数

来自分类Dev

导入中的python import

来自分类Dev

目录中的Python导入

来自分类Dev

导入中的python错误

来自分类Dev

Python 中的异步导入

来自分类Dev

Python 2或3循环导入说明

来自分类Dev

Python解决循环导入而不合并文件

来自分类Dev

什么是python中的绝对导入?

来自分类Dev

在python中以点名称导入

来自分类Dev

Python中相对导入的问题

来自分类Dev

在python中遍历导入的类

来自分类Dev

Python导入中的命名空间

来自分类Dev

Python 3中的相对导入

来自分类Dev

导入语句python中的变量

来自分类Dev

在 Python 中模拟导入的类

来自分类Dev

Python:print()中的for循环