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入门篇之对象类型
Oct 17 Python
python让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
简单了解python的内存管理机制
Jul 08 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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
单位速度在实战中的运用
2020/03/04 星际争霸
PHP控制网页过期时间的代码
2008/09/28 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
PHP实现微信发红包程序
2015/08/24 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
arguments对象
2006/11/20 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Python 错误和异常代码详解
2018/01/29 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
优秀民警事迹材料
2014/01/29 职场文书
社会发展项目建议书
2014/08/25 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
Pandas 稀疏数据结构的实现
2021/07/25 Python
MySQL数据库事务的四大特性
2022/04/20 MySQL