这是我在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
这里的原理是什么?为什么这样做才有意义呢?
答案 0 :(得分:1)
模块是全局的,即使您有多个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
时,使用x
将不会看到tests.x
更改。