从模块导入变量的特殊性



这是我 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

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

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

这是因为import做了件事:

  • 加载模块对象(如果sys.modules中尚不存在(
  • 绑定名称(import foo将名称foo绑定到模块等(。名称的绑定方式取决于import的确切形式:
    • import foo本质上是foo = sys.modules['foo']
    • import foo as bar bar = sys.modules['foo']
    • from foo import ham ham = sys.modules['foo'].ham
    • from foo import ham as spam spam = sys.modules['foo'].ham

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

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

foo = 100
bar = foo
foo = 200

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

相关内容

  • 没有找到相关文章

最新更新