从模块导入变量的特性

时间:2017-05-15 09:29:33

标签: python module global-variables

这是我在tests.py文件中的内容:

def func():
    global x
    x = 200
    return x

x = 100

现在我希望每当我发出

from tests import x

我会得到100。但事实并非如此。

>>> from tests import func
>>> from tests import x
>>> x
100
>>> func()
200
>>> x
100
>>> from tests import x
>>> x
200

这里的原理是什么?为什么这样做才有意义呢?

1 个答案:

答案 0 :(得分:1)

模块是全局的,即使您有多个import语句,也只会加载一次。设置模块全局变量保持全局。

那是因为import做了两个的事情:

  • 如果模块对象尚未存在于sys.modules
  • 中,请加载该模块对象
  • 绑定名称(import foo将名称foo绑定到模块等。如何绑定名称取决于import的确切形式:
    • import foo基本上是foo = sys.modules['foo']
    • import foo as barbar = sys.modules['foo']
    • from foo import hamham = sys.modules['foo'].ham
    • from foo import ham as spamspam = sys.modules['foo'].ham

重复import语句只会再次绑定名称,因为模块本身已经加载。

因此,使用from tests import x分配x = tests.x,创建一个新的变量名称。就像

foo = 100
bar = foo
foo = 200

bar设置为100,当您在模块中更改from tests import x时,使用x将不会看到tests.x更改。