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 22 Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
pandas读取csv文件,分隔符参数sep的实例
Dec 12 Python
python 实现UTC时间加减的方法
Dec 31 Python
python实现控制COM口的示例
Jul 03 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python如何保证输入键入数字的方法
Aug 23 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
Python 单例设计模式用法实例分析
Sep 23 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 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 JSON中文乱码的解决方法详解
2013/06/06 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
php数组键值用法实例分析
2015/02/27 PHP
JS中如何设置readOnly的值
2013/12/25 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
讲解Python中的递归函数
2015/04/27 Python
python列表的常用操作方法小结
2016/05/21 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
Python实现简单的2048小游戏
2021/03/01 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
详解rem 适配布局
2018/10/31 HTML / CSS
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
车辆安全检查制度
2014/01/12 职场文书
主持人演讲稿
2014/05/13 职场文书
军训拉歌口号
2014/06/13 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
付款委托书范本
2014/10/05 职场文书
会计求职自荐信
2015/03/26 职场文书
表彰大会新闻稿
2015/07/17 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
安全责任协议书范本
2016/03/23 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
用php如何解决大文件分片上传问题
2021/07/07 PHP