如果我有以下代码:
populationList = []
for i in range(0, 2000)
populationList.append(myObject).
populationList = []
现在删除了对它们的引用,是否清除了populationList中的所有对象?我知道Java就是这种情况,但对Python来说却是一样的吗?或者是否需要明确删除对象?
答案 0 :(得分:3)
CPython使用引用计数自动清理不再引用的对象。
每个名称,列表索引,字典值或键条目或属性都是对Python对象的引用,并且解释器根据需要递增和递减每个对象的引用计数。当计数达到0时,对象将自动从内存中清除。
将populationList
重新绑定到新列表对象时,旧列表的引用计数将降为0并将其清除。这反过来清除了对包含对象的所有引用,并且它们也被清除等等。
垃圾收集器进程还跟踪循环引用(仅引用彼此的对象),根据需要自动中断这些循环。请参阅gc
module以获取内省和改变垃圾收集器行为的工具。
您可以通过在自定义类上实现__del__
method来挂钩对象取消分配过程。请阅读文档以了解此挂钩的限制。
快速演示:
>>> class Foo:
... def __init__(self, x):
... self.x = x
... def __del__(self):
... print(self.x, 'deleted')
...
>>> populationList = []
>>> for i in range(5):
... populationList.append(Foo(i))
...
>>> populationList = []
4 deleted
3 deleted
2 deleted
1 deleted
0 deleted
其他Python实现(如Jython和IronPython)使用不同的技术来跟踪可以清理的对象。
答案 1 :(得分:0)
您无需自行删除它们。 Python与Java具有类似的垃圾收集。其他一些阅读材料可能是:http://www.digi.com/wiki/developer/index.php/Python_Garbage_Collection和https://docs.python.org/2/library/gc.html。
感谢@Martijn Pieters:您还可以在Python中显式禁用gc。但不应该。