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 django 增删改查操作 数据库Mysql
Jul 27 Python
python如何将图片转换为字符图片
Aug 19 Python
Python实现的端口扫描功能示例
Apr 08 Python
python购物车程序简单代码
Apr 18 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 Python
Mysql数据库反向生成Django里面的models指令方式
May 18 Python
python绘制分布折线图的示例
Sep 24 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 Python
python 获取计算机的网卡信息
Feb 18 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 date与gmdate的获取日期的区别
2010/02/08 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
浅谈JavaScript 声明提升
2020/09/14 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
vue实现选中效果
2020/10/07 Javascript
Python中pygame安装方法图文详解
2015/11/11 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
Python自动抢红包教程详解
2019/06/11 Python
详解用python生成随机数的几种方法
2019/08/04 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
高校自主招生自荐信
2013/12/09 职场文书
法学专业自我鉴定
2014/02/05 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
病危通知书样本
2015/04/17 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL
nginx访问报403错误的几种情况详解
2022/07/23 Servers