Python会自动清除对象吗?

时间:2014-04-10 19:14:09

标签: python object persistence

如果我有以下代码:

populationList = []
for i in range(0, 2000)
    populationList.append(myObject).

populationList = []

现在删除了对它们的引用,是否清除了populationList中的所有对象?我知道Java就是这种情况,但对Python来说却是一样的吗?或者是否需要明确删除对象?

2 个答案:

答案 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_Collectionhttps://docs.python.org/2/library/gc.html

感谢@Martijn Pieters:您还可以在Python中显式禁用gc。但不应该。