這是一個類屬性。在你的情況下,字典綁定到類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我在問爲什麼兩個調用之間沒有收集垃圾變量;該鏈接似乎在談論實例和類變量之間的差異。 –