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生成日历实例解析
Aug 21 Python
python求众数问题实例
Sep 26 Python
web.py 十分钟创建简易博客实现代码
Apr 22 Python
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
Python Django使用forms来实现评论功能
Aug 17 Python
Python中扩展包的安装方法详解
Jun 14 Python
python实现简单神经网络算法
Mar 10 Python
对Python3+gdal 读取tiff格式数据的实例讲解
Dec 04 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
python multiprocessing模块用法及原理介绍
Aug 20 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
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
php while循环控制的简单实例
2016/05/30 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
[51:22]Fnatic vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
wxPython框架类和面板类的使用实例
2014/09/28 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python Series从0开始索引的方法
2018/11/06 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
经典C++面试题一
2016/11/06 面试题
财务管理专业推荐信
2013/11/19 职场文书
校园自助餐厅的创业计划书
2013/12/26 职场文书
2015年采购工作总结
2015/04/10 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
第二次离婚起诉书
2015/05/18 职场文书
离婚起诉状范本
2015/05/19 职场文书
热血教师观后感
2015/06/10 职场文书