这是一个类属性。在你的情况下,字典绑定到类Bar
。每次输入bar
时,都会得到相同的类bar.Bar
(毕竟它在bar
的全局命名空间中),因此,您将得到相同的字典bar.Bar.b
。
如果希望每个Bar
情况下有不同的字典,你需要做一个实例:
class Bar(object):
def __init__(self):
self.b = {}
然后:
def foo1():
import bar
bar.Bar().b["key"] = "foo1"
def foo2():
import bar
print bar.Bar().b.get("key", "foo2")
foo1()
foo2()
至于为什么模块bar
没有被垃圾收集,当你导入一些东西时,python存储对该模块的引用(参见sys.modules
)。下次您导入该模块时,python会从sys.modules
中挑选适当的项目,并为您提供参考。这有几个原因。
- 效率 - 为什么重新评估您已经评估过的代码?
- 理智的行为
想象具有特殊价值的模块:
# mod.py
CONSTANT = object()
现在要使用在foo.py
和bar.py
。
# bar.py
import mod
def bar():
return mod.CONSTANT
# foo.py
import mod
import bar
if bar.bar() is mod.CONSTANT:
do_something()
如果导入没有缓存,然后mod.CONSTANT
可以在foo
是不同的,在bar
这将是非常令人吃惊的。
@mgilson我在问为什么两个调用之间没有收集垃圾变量;该链接似乎在谈论实例和类变量之间的差异。 –