foo.py:
i = 10 def fi(): global i i = 99
bar.py:
import foo from foo import i print i, foo.i foo.fi() print i, foo.i
这是有问题的.i
变化时为什么不foo.i
改变?
罗斯所说的是如此恢复foo:
_i = 10 def getI(): return _i def fi(): global _i _i = 99
然后你会看到它按照你想要的方式工作:
>>> import foo >>> print foo.getI() 10 >>> foo.fi() >>> print foo.getI() 99
从某种意义上说,它也可以避免导出全局,但仍然提供对它的读访问权.
什么import
做的bar.py
是成立了一个名为标识i
的bar.py
模块命名空间中指向相同的地址称为标识符i
的foo.py
模块命名空间.
这是一个重要的区别...... bar.i
不是指向foo.i
,而是指向同一时间10
保持对象所在的内存中的相同空间foo.i
.在python中,变量名不是内存空间......它们是指向内存空间的标识符.在bar中导入时,您将设置本地名称空间标识符.
代码的行为与预期直至foo.fi()
被调用,当所述标识符i
在foo.py命名空间被改变为指向文字99,它是一个对象在内存在明显不同的位置比10.现在模块级名字空间字典为foo
具有i
识别内存中的不同对象而不是i
bar.py中的标识符.
Shane和rossfabricant对如何调整模块以达到您想要的效果有很好的建议.