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