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爬取网站数据保存使用的方法
Nov 20 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
Python DataFrame.groupby()聚合函数,分组级运算
Sep 18 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
Django 路由控制的实现
Jul 17 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 Python
Keras在训练期间可视化训练误差和测试误差实例
Jun 16 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 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
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
smarty获得当前url的方法分享
2014/02/14 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
PHP生成plist数据的方法
2015/06/16 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
微信小程序 简易计算器实现代码实例
2019/09/02 Javascript
python实现批量获取指定文件夹下的所有文件的厂商信息
2014/09/28 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
公务员综合考察材料
2014/02/01 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技