python del删除引用 和 垃圾回收

一、del 和 垃圾回收

del 语句删除名称,而不是对象。del 命令可能会导致对象被当作垃圾回收,但是仅当删除 的变量保存的是对象的最后一个引用,或者无法得到对象时。重新绑定也可能会导致对象 的引用数量归零,导致对象被销毁。

有个__del__特殊方法,但是它不会销毁实例,不应该在代码中调用。即将销毁实例时,Python 解释器会调用 __del__方法,给实例最后的机会,释放外部 资源。自己编写的代码很少需要实现 __del__代码,有些 Python 新手会花时 间实现,但却吃力不讨好,因为__del__很难用对。详情参见 Python 语言参 考手册中“Data Model”一章中__del__ 特殊方法的文档(https://docs.python.org/3/reference/datamodel.html#object.del)。

在 CPython 中,垃圾回收使用的主要算法是引用计数。实际上,每个对象都会统计有多少 引用指向自己。当引用计数归零时,对象立即就被销毁:CPython 会在对象上调用__del__方法(如果定义了),然后释放分配给对象的内存。CPython 2.0 增加了分代垃圾回收算法, 用于检测引用循环中涉及的对象组——如果一组对象之间全是相互引用,即使再出色的引用方式也会导致组中的对象不可获取。Python 的其他实现有更复杂的垃圾回收程序,而且 不依赖引用计数,这意味着,对象的引用数量为零时可能不会立即调用__del__方法

在这里插入图片描述
del 不会删除对象,但是执行 del 操作后可能会导致对象不可 获取,从而被删除。

你可能觉得奇怪,为什么示例 8-16 中的 {1, 2, 3} 对象被销毁了?毕竟,我们把 s1 引用 传给 finalize 函数了,而为了监控对象和调用回调,必须要有引用。这是因为,finalize 持有 {1, 2, 3} 的弱引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值