2

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

4

2 回答 2

7

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

这与其说是泄漏,不如说是对可变关键字参数的寿命的误解。函数本身仍然可以调用del _cache[42]来删除这些对象。

有关该主题的更多信息,请参阅“Least Astonishment”和可变默认参数

于 2012-07-27T08:56:32.207 回答
1

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

您应该显式删除它 ( del _cache[42]),或者更改自己的字典副本或任何其他可变对象(您可以使用copy模块)。

于 2012-07-27T08:59:19.737 回答