这是我 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
更改。