我想在其他模块中使用全局变量,并将其值的变化“传播”到其他模块。
a.py:
x="fail"
def changeX():
global x
x="ok"
b.py:
from a import x, changeX
changeX()
print x
如果我运行b.py,我希望它打印“ok”,但它确实打印“失败”。
(运行python-2.7)
答案 0 :(得分:12)
简而言之:如果不修改代码,就无法打印“ok”。
from a import x, changeX
相当于:
import a
x = a.x
changeX = a.changeX
换句话说,from a import x
不会创建指向x
的{{1}},它会在a.x
模块中创建新的全局变量x
使用当前值b
。由此可见,以后对a.x
的更改不会影响a.x
。
要使代码按预期工作,只需将b.x
中的代码更改为b.py
:
import a
您将获得更少杂乱的导入,更容易阅读代码(因为很清楚哪些标识符来自哪里而不查看导入列表),循环导入的问题较少(因为不是一次都需要所有标识符),以及import a
a.changeX()
print a.x
等工具有更好的机会工作。
答案 1 :(得分:2)
您也可以使用可变容器,例如list:
a.py
x = ['fail']
def changeX():
x[0] = 'ok'
b.py
from a import changeX, x
changeX()
print x[0]
答案 2 :(得分:2)
您还可以在changeX
之后添加另一个导入语句。这会将代码从b.py转换为
from a import x, changeX
changeX()
from a import x
print x
这表明,通过调用changeX
,只会更改模块x
中的a
。再次导入它会再次将更新后的值绑定到标识符x
。