Python 全局变量似乎不能跨模块工作



Code

我想在其他模块中使用全局变量,并将其值的更改"传播"到其他模块。

a.py:

x="fail"
def changeX():
    global x
    x="ok"

b.py:

from a import x, changeX
changeX()
print x

如果我运行 b.py,我希望它打印"ok",但它确实打印"失败"。

问题

  1. 为什么?
  2. 如何让它打印"ok"代替?

(运行python-2.7)

简而言之:如果不修改代码,就无法使其打印"ok"。

from a import x, changeX相当于:

import a
x = a.x
changeX = a.changeX

换句话说,from a import x不会创建一个间接到a.xx,它会在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]

相关内容

  • 没有找到相关文章

最新更新