Python全局变量似乎不适用于模块

时间:2012-11-15 17:55:29

标签: python global-variables

代码

我想在其他模块中使用全局变量,并将其值的变化“传播”到其他模块。

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. 如何让它打印“确定”呢?
  3. (运行python-2.7)

3 个答案:

答案 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