2012-07-27 63 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模块)。