gpt4 book ai didi

python - 为什么我不能在 python 中更改另一个模块变量?

转载 作者:太空狗 更新时间:2023-10-30 02:14:04 26 4
gpt4 key购买 nike

我试图让第二个模块在循环导入中修改第一个模块的变量,但它似乎不起作用。

我有 2 个问题:1) 为什么这行不通/从语言开发的角度来看这样做的原因是什么,以及 2) 是否有任何简单的解决方案可以让我以稍微不同的方式做同样的事情?

a.py:

import b

test1 = 'a'
test2 = None
test3 = '3'

if __name__ == '__main__':
print test1, test2, test3 #prints 'a', None, 3
b.changeVars()
print test1, test2, test3 #prints 'a', None, 3 (i.e. nothing has changed)

b.py:

import a

def changeVars():
print a.test1, a.test2, a.test3 #prints 'a', None, 3
a.test1 = 'NEW VAR 1'
a.test2 = 'NEW VAR 2'
a.test3 = 'NEW VAR 3'

print a.test1, a.test2, a.test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3'

最佳答案

发生的事情是,当 b.py 尝试导入 a 时,sys.modules 中没有它的条目,因为该条目位于 __main__ 下。这会导致导入机制重新导入模块并将其置于名称 a 下。所以现在有一个 a 模块和一个完全不相关的 __main__ 模块。将 b.py 更改为类似这样的内容即可。

import sys
a = sys.modules['__main__']

def changeVars():
print a.test1, a.test2, a.test3 #prints 'a', None, 3
a.test1 = 'NEW VAR 1'
a.test2 = 'NEW VAR 2'
a.test3 = 'NEW VAR 3'

print a.test1, a.test2, a.test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3'

产量

aaron@aaron-laptop:~/code/tmp$ python a.py
a None 3
a None 3
NEW VAR 1 NEW VAR 2 NEW VAR 3
NEW VAR 1 NEW VAR 2 NEW VAR 3
aaron@aaron-laptop:~/code/tmp$

为了更好地了解正在发生的事情,请考虑以下文件:

#a.py
import b
import a

test = 'Foo'

if __name__ == '__main__':
print test #prints 'Foo'
b.changeVars()
print a.test, test # prints 'Foo', 'Bar'

#b.py
import a as a1

import sys
a2 = sys.modules['__main__']

def changeVars():

print a1.test, a2.test # Prints 'Foo', 'Foo'
a2.test = 'Bar'
print a1.test, a2.test # Prints 'Foo', 'Bar'

哪些输出

Foo
Foo Foo
Foo Bar
Foo Bar

这清楚地表明 sys.modules['a']sys.modules['__main__'] 指的是两个不同的对象。解决办法大概是把下面的作为a.py

的第一行
import __main__ as a  # due to Ignacio Vazquez-Abrams 

这样做允许任何其他模块也import a。总的来说,我真的不明白你为什么要这样做。可能有更好的方法来完成这项工作。

关于python - 为什么我不能在 python 中更改另一个模块变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290178/

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