gpt4 book ai didi

python - 模块重新加载语义

转载 作者:行者123 更新时间:2023-12-01 07:22:01 25 4
gpt4 key购买 nike

考虑以下代码:

mod.py
--------
x = 1

main.py
--------
1: from importlib import reload
2: import mod as mod1
3: mod1.x = 2
4: import mod as mod2
5: print(mod2.x)
6: reload(mod2)
7: print(mod1.x)

第 2 行创建一个 mod 对象并将其分配给 mod1。第 4 行为 mod1 创建了一个名为 mod2 的别名。第 5 行打印 2,因为 mod2 是对与 mod1 相同的对象的引用,该对象已由第 3 行更新。第 6 行重新加载 mod。 py 使用对象 mod2,第 7 行打印 1

重新加载到底是如何工作的?第6行还更新了mod1,它怎么知道mod1是mod2的别名?是否有某种机制可以找出给定名称的同义词?

最佳答案

Python中没有别名之类的东西,只有names that refer to values 。人们喜欢使用 as 关键字别名来调用语句,但是 import mod as mod1 本质上只是 import mod 的简写;模1=模;删除模组

现在说到真正的问题,模块是一种特殊情况,并且在 import 机制的特殊性上遇到困难几乎是 Python 体验的一部分。模块的导入方式使它们的行为类似于单例,因此某个模块 mod 的每个 import 语句都引用 mod 的同一个实例。

每当您尝试导入模块时,解释器都会首先检查 sys.modules,如果在运行 session 中首次导入该模块,则会将其添加到其中。

当你说

Line 2 creates a mod object and assigns it to mod1.

实际发生的事情是

Line 2 loads the module mod for this session and binds a reference of it to the name mod1.

<小时/>

测试两个名称同一性的一种方法是使用 is 关键字:

>>> import mod as mod1
>>> import mod as mod2
>>> mod1 is mod2
True # they are not only equal, they are the same
>>> from importlib import reload
>>> reload(mod1)
<module 'mod' from '/user/mod.py'>
>>> mod1 is mod2
True # still the same

鉴于您最初的示例,很难甚至不可能保存单个模块的两个不同实例(它们也无法使用 copy.copy 进行复制) - 您最好实现相反,您作为对象拥有的功能。

关于python - 模块重新加载语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57657670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com