Code
我想在其他模块中使用全局变量,并将其值的更改"传播"到其他模块。
a.py:
x="fail"
def changeX():
global x
x="ok"
b.py:
from a import x, changeX
changeX()
print x
如果我运行 b.py,我希望它打印"ok",但它确实打印"失败"。
问题
- 为什么?
- 如何让它打印"ok"代替?
(运行python-2.7)
简而言之:如果不修改代码,就无法使其打印"ok"。
from a import x, changeX
相当于:
import a
x = a.x
changeX = a.changeX
换句话说,from a import x
不会创建一个间接到a.x
的x
,它会在b
模块中创建一个新的全局变量x
,当前值为 a.x
。由此可见,以后对a.x
的更改不会影响b.x
。
要使您的代码按预期工作,只需将 b.py
中的代码更改为 import a
:
import a
a.changeX()
print a.x
您将拥有更少的混乱导入,更易于阅读的代码(因为无需查看导入列表即可清楚地知道标识符来自何处),循环导入的问题更少(因为不是一次需要所有标识符),并且像reload
这样的工具有更好的机会工作。
在 changeX
之后添加另一个导入语句。这会将代码从 b.py 变成
from a import x, changeX
changeX()
from a import x
print x
这说明通过调用changeX
,只会更改模块a
中的x
。再次导入它,将更新的值再次绑定到标识符x
。
您也可以使用可变容器,例如列表:
a.py
x = ['fail']
def changeX():
x[0] = 'ok'
b.py
from a import changeX, x
changeX()
print x[0]