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实现递归遍历文件夹并删除文件
Apr 18 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
利用python将图片转换成excel文档格式
Dec 30 Python
python将秒数转化为时间格式的实例
Sep 16 Python
浅析python参数的知识点
Dec 10 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
Python制作词云图代码实例
Sep 09 Python
QML使用Python的函数过程解析
Sep 26 Python
Python面向对象编程基础实例分析
Jan 17 Python
Python2手动安装更新pip过程实例解析
Jul 16 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 json_encode()函数返回json数据实例代码
2014/10/10 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
input 高级限制级用法
2009/03/26 Javascript
快速排序 php与javascript的不同之处
2011/02/22 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
2016/12/23 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
Python Requests安装与简单运用
2016/04/07 Python
python与C互相调用的方法详解
2017/07/14 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python自定义一个异常类的方法
2019/06/27 Python
pygame实现五子棋游戏
2019/10/29 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
Python socket服务常用操作代码实例
2020/06/22 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
音乐表演专业毕业生求职信
2013/10/14 职场文书
个人四风问题整改措施
2014/10/24 职场文书
民政局标准版离婚协议书
2014/12/01 职场文书
初二学生评语大全
2014/12/26 职场文书
原告代理词范文
2015/05/25 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
go类型转换及与C的类型转换方式
2021/05/05 Golang
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python