它有内存泄漏吗?

时间:2012-07-27 08:52:28

标签: python memory-leaks objgraph

我最近阅读了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

它表明"非常明显且容易找到'泄漏'。这有内存泄漏吗?它是dict _cache吗?

2 个答案:

答案 0 :(得分:5)

_cache是一个带有可变默认值的关键字参数,它确实在函数体中发生了变异。这将'MyBigFatObjects个实例永久存储在该可变关键字参数中。

这不是对可变关键字参数长寿的误解。函数本身仍然可以调用del _cache[42]来删除这些对象。

有关此主题的详情,请参阅"Least Astonishment" and the Mutable Default Argument

答案 1 :(得分:1)

由于dict是可变的,因此在其中所做的更改也会影响调用者,因此将保留对两个MyBigFatObject的引用。

你应该明确地删除它(del _cache[42]),而是在自己的字典副本或任何其他可变对象中进行更改(你可以使用copy模块)。