当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《python中的导入是静态的,任何解决方案?》经验,为你挑选了2个好方法。

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改变?



1> Shane C. Mas..:

罗斯所说的是如此恢复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

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



2> Jarret Hardi..:

什么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对如何调整模块以达到您想要的效果有很好的建议.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有