Python全局变量似乎无法跨模块工作


问题内容

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

a.py:

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

b.py:

from a import x, changeX
changeX()
print x

如果我运行b.py,我希望它打印“确定”,但实际上却打印“失败”。

问题

  1. 这是为什么?
  2. 如何使它打印“确定”呢?

(运行python-2.7)


问题答案:

简而言之:如果不修改代码,则无法使其打印为“ ok”。

from a import x, changeX 等效于:

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

换句话说,from a import x不创建x间接指向的a.x,而是xb模块中使用 当前
值创建一个新的全局变量a.x。因此,以后的更改a.x不会影响b.x

为了使您的代码按预期工作,只需将代码更改b.pyimport a

import a
a.changeX()
print a.x

您将减少混乱的导入,更易于阅读代码(因为无需查看导入列表即可清楚地知道哪个标识符来自何处),循环导入的问题更少(因为并非一次需要所有标识符),并且有更好的机会喜欢reload工作的工具。