gpt4 book ai didi

python - 如何从另一个模块更改模块变量?

转载 作者:IT老高 更新时间:2023-10-28 21:11:54 28 4
gpt4 key购买 nike

假设我有一个名为 bar 的包,它包含 bar.py:

a = None

def foobar():
print a

__init__.py:

from bar import a, foobar

然后我执行这个脚本:

import bar

print bar.a
bar.a = 1
print bar.a
bar.foobar()

这是我的期望:

None
1
1

这是我得到的:

None
1
None

谁能解释我的误解?

最佳答案

您正在使用 from bar import aa 成为导入模块的全局范围(或​​ import 语句出现的任何范围)中的符号。

当您为 a 分配新值时,您只是更改了 a 指向的值,而不是实际值。尝试使用 __init__.py 中的 import bar 直接导入 bar.py 并通过设置 bar.a = 1 在那里进行实验。这样,您实际上将修改 bar.__dict__['a'] 这是 a 在此上下文中的“真实”值。

这三层有点复杂,但是 bar.a = 1 改变了名为 bar 的模块中 a 的值,实际上是派生自 __init__.py。它不会改变 foobar 看到的 a 的值,因为 foobar 存在于实际文件 bar.py 中。如果你想改变它,你可以设置 bar.bar.a

这是使用 from foo import bar 形式的 import 语句的危险之一:它将 bar 拆分为两个符号,一个在 foo 中全局可见,它开始指向原始值,而另一个符号在执行 import 语句的范围内可见。更改符号指向的位置也不会更改它所指向的值。

当试图从交互式解释器中重新加载一个模块时,这种东西是一个 killer 。

关于python - 如何从另一个模块更改模块变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3536620/

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