python中的导入是静态的,任何解决方案?

Xol*_*lve 4 python

foo.py:

i = 10

def fi():
    global i
    i = 99
Run Code Online (Sandbox Code Playgroud)

bar.py:

import foo
from foo import i

print i, foo.i
foo.fi()
print i, foo.i
Run Code Online (Sandbox Code Playgroud)

这是有问题的.i变化时为什么不foo.i改变?

Sha*_*son 8

罗斯所说的是如此恢复foo:

_i = 10

def getI():
    return _i

def fi():
    global _i
    _i = 99
Run Code Online (Sandbox Code Playgroud)

然后你会看到它按照你想要的方式工作:

>>> import foo
>>> print foo.getI()
10
>>> foo.fi()
>>> print foo.getI()
99
Run Code Online (Sandbox Code Playgroud)

从某种意义上说,它也可以避免导出全局,但仍然提供对它的读访问权.


Jar*_*die 7

什么import做的bar.py是成立了一个名为标识ibar.py模块命名空间中指向相同的地址称为标识符ifoo.py模块命名空间.

这是一个重要的区别...... bar.i不是指向foo.i,而是指向同一时间10保持对象所在的内存中的相同空间foo.i.在python中,变量名不是内存空间......它们是指向内存空间的标识符.在bar中导入时,您将设置本地名称空间标识符.

代码的行为与预期直至foo.fi()被调用,当所述标识符i在foo.py命名空间被改变为指向文字99,它是一个对象在内存在明显不同的位置比10.现在模块级名字空间字典为foo具有i识别内存中的不同对象而不是ibar.py中的标识符.

Shane和rossfabricant对如何调整模块以达到您想要的效果有很好的建议.