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 Sleep休眠函数使用简单实例
Feb 02 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
numpy中索引和切片详解
Dec 15 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
Python文件读写常见用法总结
Feb 22 Python
Python字符串的常见操作实例小结
Apr 08 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
在Python中等距取出一个数组其中n个数的实现方式
Nov 27 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 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 Ajax乱码
2008/04/09 PHP
php实现的简单检验登陆类
2015/06/18 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
php use和include区别总结
2019/10/13 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
使用python实现对元素的长截图功能
2019/11/14 Python
如何获取Python简单for循环索引
2019/11/21 Python
python基于opencv检测程序运行效率
2019/12/28 Python
Python进行特征提取的示例代码
2020/10/15 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
小学生考试获奖感言
2014/01/30 职场文书
进口业务员岗位职责
2014/04/06 职场文书
留学推荐信英文范文
2015/03/26 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书