我最近阅读了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吗?
答案 0 :(得分:5)
_cache
是一个带有可变默认值的关键字参数,它确实在函数体中发生了变异。这将'MyBigFatObjects
个实例永久存储在该可变关键字参数中。
这不是对可变关键字参数长寿的误解。函数本身仍然可以调用del _cache[42]
来删除这些对象。
有关此主题的详情,请参阅"Least Astonishment" and the Mutable Default Argument。
答案 1 :(得分:1)
由于dict是可变的,因此在其中所做的更改也会影响调用者,因此将保留对两个MyBigFatObject
的引用。
你应该明确地删除它(del _cache[42]
),而是在自己的字典副本或任何其他可变对象中进行更改(你可以使用copy模块)。