我最近读了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
是一个具有可变默认值的关键字参数,它确实在函数体中发生了变异。这将在可变关键字参数中永久存储MyBigFatObjects
实例。
这与其说是泄漏,不如说是对可变关键字参数的寿命的误解。函数本身仍然可以调用del _cache[42]
来删除这些对象。
有关此主题的详细信息,请参见"Least Astonishment" and the Mutable Default Argument。
关于python - 有内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11684516/