python - Python 会自动清除对象吗?

标签 python object persistence

如果我有以下代码:

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/

相关文章:

python - 通过 C DLL 调用函数时出错

python - python 中的 json 输出错误

来自 CSV 的二维列表中的 Python 组值

javascript - 哪个更好的Javascript对象模式

C++以编程方式将字符串编码为字符串文字

java - 如何更改 JPA 生成的列名的默认格式

python - 如何获取Generic[T]子类的成员变量的真实声明类型

javascript - 在嵌套对象上加入 (';' )

python - 如何将 python 函数/类/模块对象转换为 python 代码对象

netbeans - 在 JBoss 中设置 Mysql 连接器模块