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

esc*_*ram 9 python global-variables

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

a.py:

x="fail"
def changeX():
    global x
    x="ok"
Run Code Online (Sandbox Code Playgroud)

b.py:

from a import x, changeX
changeX()
print x
Run Code Online (Sandbox Code Playgroud)

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

问题

  1. 这是为什么?
  2. 如何让它打印"确定"呢?

(运行python-2.7)

use*_*342 13

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

from a import x, changeX 相当于:

import a
x = a.x
changeX = a.changeX
Run Code Online (Sandbox Code Playgroud)

换句话说,from a import x不创建x那个间接a.x,它xb模块中创建一个新的全局变量,其当前值为a.x.由此可见,后来的变化a.x不会影响b.x.

要使代码按预期工作,只需将代码更改b.pyimport a:

import a
a.changeX()
print a.x
Run Code Online (Sandbox Code Playgroud)

您将获得更少杂乱的导入,更容易阅读代码(因为很明显标识符来自哪里而不查看导入列表),循环导入的问题较少(因为不是一次都需要所有标识符),并且更有可能reload工作喜欢工作.