如果我有以下代码:
populationList = []
for i in range(0, 2000)
populationList.append(myObject).
populationList = []
既然对它们的引用已被删除,populationList 中的所有对象是否都会被清除?我知道 Java 就是这种情况,但 Python 也一样吗?还是应该明确删除对象?
最佳答案
CPython 使用引用计数 自动清理不再被引用的对象。
每个名称、列表索引、字典值或键条目或属性都是对 Python 对象的引用,解释器会根据需要递增和递减每个对象的引用计数。当计数达到 0 时,对象会自动从内存中清除。
当您将 populationList
重新绑定(bind)到一个新 列表对象时,旧列表的引用计数会下降到 0 并被清除。这反过来又清除了对包含对象的所有引用,并且它们也被清除,等等。
垃圾收集器进程还会跟踪循环引用(仅相互引用的对象),并根据需要自动打破此类循环。查看gc
module用于反省和改变垃圾收集器行为的工具。
您可以通过实现 __del__
method 来 Hook 对象解除分配过程。在您的自定义类(class)上。请务必阅读文档以了解此 Hook 的限制。
快速演示:
>>> 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)使用不同的技术来跟踪可以清理的对象。
关于python - Python 会自动清除对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997011/