如何从另一个模块更改模块变量?
假设我有一个名为的软件包bar
,其中包含bar.py
:
a = None
def foobar():
print a
和__init__.py
:
from bar import a, foobar
然后我执行以下脚本:
import bar
print bar.a
bar.a = 1
print bar.a
bar.foobar()
这是我的期望:
None
1
1
这是我得到的:
None
1
None
谁能解释我的误解?
-
您正在使用
from bar import a
。a
在导入模块的全局范围(或发生import语句的任何范围)中成为符号。当您为指定新值时
a
,您也只是在更改哪些值a
点,而不是实际值。尝试bar.py
直接使用import bar
in导入,__init__.py
并通过设置在那里进行实验bar.a = 1
。这样,您实际上将在此上下文中修改bar.__dict__['a']
哪个是“实际”值a
。它有点令人费解,分为三层,但
bar.a = 1
更改了实际上源自的a
名为模块的值。它不会更改看到值,因为它存在于实际文件中。您可以设置是否要更改它。bar``__init__.py``a``foobar``foobar``bar.py``bar.bar.a
这是使用语句
from foo import bar
形式的危险之一import
:它将分成bar
两个符号,一个符号在全局范围内可见,从foo
该符号开始指向原始值,而另一个符号在import
执行该语句的范围内可见。更改符号指向的位置也不会更改其指向的值。尝试
reload
从交互式解释器访问模块时,这种东西是致命的。