我很惊讶地发现
import foo
和
from foo import *
对全球成员有不同的影响.我想确认我的实验是正确的行为.
在第一个示例中,更改模块foo中的成员将反映在导入foo的所有代码中.但是,在稍后的情况下更改该成员似乎只影响导入它的文件.换句话说,使用后面的方法将给每个导入文件自己的foo成员副本.
解决方法
是的,你的意见是正确的.这是绑定在Python中工作的方式的结果.
当一个人
import foo
那么foo将成为引用模块foo的全局名称.当一个人
foo.bar = 7
然后,引用并且加载对象foo.然后7存储在bar属性中.
当另一个模块导入foo时,它只将对象从sys.modules [‘foo’]中拉出,并获取修改的值.
当一个人
from foo import bar
全局变量()[‘bar’]设置为引用foo.bar.当一个人以后
bar = 7
全局变量()[‘bar’]不再引用foo.bar,但引用了一个7.的副本.也就是说,导入模块的全局范围中的原始绑定只是被替换.
在第一个示例中,一个是修改存储在sys.modules中的对象的属性,并且对所有导入它的模块都是通用的.在第二个示例中,一个是修改导入模块的全局范围.
如果有人要做一些事情
from foo import fobaz fobaz.foobar = 7
那么该更改将被传播到其他导入模块,因为一个不会覆盖全局引用,而是修改其指向的对象的属性.所以本质上,你应该能够修改可变对象,只要你不覆盖全局绑定.
我认为像这样的东西是最接近你将能够干净地获得一个真正的全球在python.作为一种语言,它极大地重视了命名空间.