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 相关文章推荐
Python3访问并下载网页内容的方法
Jul 28 Python
Python实现简单的四则运算计算器
Nov 02 Python
python去掉空白行的多种实现代码
Mar 19 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 Python
Python常用特殊方法实例总结
Mar 22 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
python实现从wind导入数据
Dec 03 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
使用numpy nonzero 找出非0元素
May 14 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
jquery动态改变form属性提交表单
2014/06/03 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Python实现的字典值比较功能示例
2018/01/08 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
基于python指定包的安装路径方法
2018/10/27 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
Python验证码截取识别代码实例
2020/05/16 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
华润集团网上药店:健一网
2016/09/19 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
学习新党章思想汇报
2014/01/09 职场文书
小学中秋节活动方案
2014/02/06 职场文书
运动会通讯稿500字
2014/02/20 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
win10下go mod配置方式
2021/04/25 Golang
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers
Python绘画好看的星空图
2022/03/17 Python