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 相关文章推荐
对numpy中数组元素的统一赋值实例
Apr 04 Python
Python错误处理操作示例
Jul 18 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
Python中and和or如何使用
May 28 Python
Python网页解析器使用实例详解
May 30 Python
Python常见反爬虫机制解决方案
Jun 01 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 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数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP goto语句用法实例
2019/08/06 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
让Firefox支持event对象实现代码
2009/11/07 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
世界上最大的二手相机店:KEN
2017/05/17 全球购物
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
大专应届生个人的自我评价
2013/11/21 职场文书
药学专业个人的自我评价
2013/12/31 职场文书
毕业生自荐信如何写
2014/03/24 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
门面房租房协议书
2014/12/01 职场文书
监考失职检讨书
2015/01/26 职场文书
社区党建工作总结2015
2015/05/13 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书