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 装饰器功能以及函数参数使用介绍
Jan 27 Python
python定时执行指定函数的方法
May 27 Python
整理Python 常用string函数(收藏)
May 30 Python
python中import学习备忘笔记
Jan 24 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
Sep 30 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 Python
python opencv 实现对图像边缘扩充
Jan 19 Python
python批量生成条形码的示例
Oct 10 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 Python
Python的Tqdm模块实现进度条配置
Feb 24 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过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
php英文单词统计器
2016/06/23 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
js获取视频时长代码
2014/04/10 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
新年快乐! python实现绚烂的烟花绽放效果
2019/01/30 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
Python将字典转换为XML的方法
2020/08/01 Python
python中pyqtgraph知识点总结
2021/01/26 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
PHP经典面试题
2016/09/03 面试题
春节活动策划方案
2014/01/24 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
科技工作者先进事迹
2014/08/16 职场文书
作文评语集锦
2014/12/25 职场文书
2015年超市工作总结
2015/04/09 职场文书
新郎新娘致辞
2015/07/31 职场文书
python中subplot大小的设置步骤
2021/06/28 Python
JavaScript ES6的函数拓展
2022/01/18 Javascript
Nginx的基本概念和原理
2022/03/21 Servers
frg-100简单操作(设置)说明
2022/04/05 无线电
Redis基本数据类型Set常用操作命令
2022/06/01 Redis