2012-07-27 70 views
1

最近,我讀objgraph文檔,我感到困惑下面的代碼它是否有內存泄漏?

>>> class MyBigFatObject(object): 
...  pass 
... 
>>> def computate_something(_cache={}): 
...  _cache[42] = dict(foo=MyBigFatObject(), 
...      bar=MyBigFatObject()) 
...  # a very explicit and easy-to-find "leak" but oh well 
...  x = MyBigFatObject() # this one doesn't leak 

這表明,「一個非常露骨,易於找到的‘漏’」。這是否有內存泄漏?這是字典_cache?

+1

它不是泄漏,因爲只要'computate_something'在範圍內,總會有'_cache'的引用,所以它會一直保留在內存中 – GP89 2012-07-27 08:54:21

回答

5

_cache是一個帶有可變默認值的關鍵字參數,它確實在函數體中發生了變異。這會將MyBigFatObjects實例永久存儲在該可變關鍵字參數中。

這不是一個漏洞,而是對可變關鍵字參數的長壽誤解。該函數本身仍然可以調用del _cache[42]來刪除這些對象。

有關該主題的更多信息,請參閱"Least Astonishment" and the Mutable Default Argument

1

由於字典是可變的,所做的更改也會影響調用者,因此將保留對兩個MyBigFatObject的引用。

您應該明確地刪除它(del _cache[42]),o更改自己的字典副本或任何其他可變對象(您可以使用copy模塊)。