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使用post提交数据到远程url的方法
Apr 29 Python
Python正则表达式常用函数总结
Jun 24 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
python学生管理系统代码实现
Apr 05 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
python 随机森林算法及其优化详解
Jul 11 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
Python 处理日期时间的Arrow库使用
Aug 18 Python
Flask处理Web表单的实现方法
Jan 31 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
Python竟然能剪辑视频
May 25 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里的单例类写法实例
2015/06/25 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
跟老齐学Python之编写类之三子类
2014/10/11 Python
python optparse模块使用实例
2015/04/09 Python
Python写的一个简单监控系统
2015/06/19 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
浅析Python 序列化与反序列化
2020/08/05 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
python中pyplot基础图标函数整理
2020/11/10 Python
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
人力资源专员岗位职责
2014/01/30 职场文书
低碳环保演讲稿
2014/08/28 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL