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创建线程示例
May 06 Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
Python numpy 点数组去重的实例
Apr 18 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
python try...finally...的实现方法
Nov 25 Python
Python机器学习之逻辑回归
May 11 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
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
Python Queue模块详解
2014/11/30 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
Python Cookie 读取和保存方法
2018/12/28 Python
Python List cmp()知识点总结
2019/02/18 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
黄金酒广告词
2014/03/21 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
庆七一活动总结
2014/08/27 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
小学端午节活动总结
2015/02/11 职场文书
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android