Python中垃圾回收和del语句详解


Posted in Python onNovember 15, 2018

Python中的垃圾回收算法是采用引用计数, 当一个对象的引用计数为0时, Python的垃圾回收机制就会将对象回收

a = "larry"
b = a

larry这个字符串对象, 在第一行被贴了a标签后, 引用计数为1, 之后在第二行, 由贴上了b标签, 此时, 该字符串对象的引用计数为

a = "larry"
b = a
del a

注意: 在Python语言中, del语句操作某个对象的时候, 并不是直接将该对象在内存中删除, 而是将该对象的引用计数-1

>>> a = "larry"
>>> b = a
>>> del a
>>> id(b)
4572141808
>>> id(a)
Traceback (most recent call last):
 File "<input>", line 1, in <module>
  id(a)
NameError: name 'a' is not defined

从以上示例中可以看出, larry这个字符串对象在第一行被贴上了a标签, 此时字符串对象的引用计数为1, 接着第二行又被贴上了b标签, 此时该字符串对象的引用计数为2, 在第三行中, del语言删除了a变量(标签), 在后续的print中可以看出, 内存中实际的字符串对象并没有被删除, del语言只是删除了一个变量对该字符串对象的引用, 所以对于larry这个字符串对象来说, 效果只是引用计数-1

魔法函数之__del__

类中的__del__魔法函数, 支持我们自定义清理对象的逻辑, 当Python解释器使用del语言删除类的对象的时候, 会自动调用类中的__del__函数, 我们可以对其进行重载

>>> class Ref:
...
...   def __init__(self, name):
...     self.name = name
...
...   def __del__(self):
...     print("删除对象")
...     del self.name
...
>>>
>>> r = Ref(name="larry")
>>> print(r.name)
larry
>>>
>>> del r

删除对象

>>>
>>> print(r.name)
Traceback (most recent call last):
 File "<input>", line 1, in <module>
  print(r.name)
NameError: name 'r' is not defined

我们可以通过重载__del__魔法函数, 自己灵活控制在del 对象的时候执行哪些善后操作

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python字符转换
Sep 06 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
May 14 Python
python的else子句使用指南
Feb 27 Python
Python对象转JSON字符串的方法
Apr 27 Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
Django给admin添加Action的步骤详解
May 01 Python
Python数据类型之Dict字典实例详解
May 07 Python
python3使用print打印带颜色的字符串代码实例
Aug 22 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
Matplotlib中文乱码的3种解决方案
Nov 15 #Python
Python使用sorted对字典的key或value排序
Nov 15 #Python
python并发和异步编程实例
Nov 15 #Python
Numpy截取指定范围内的数据方法
Nov 14 #Python
python numpy元素的区间查找方法
Nov 14 #Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 #Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 #Python
You might like
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
Python类属性的延迟计算
2016/10/22 Python
python绘制直线的方法
2018/06/30 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
python关于调用函数外的变量实例
2019/12/26 Python
jupyter notebook 重装教程
2020/04/16 Python
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
绿色学校实施方案
2014/03/31 职场文书
销售个人求职信范文
2014/04/28 职场文书
机房搬迁方案
2014/05/01 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
授权委托书格式范文
2014/08/02 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
北京青年观后感
2015/06/15 职场文书
消夏晚会主持词
2015/06/30 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技