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中列表(list)操作方法汇总
Aug 18 Python
linux 下实现python多版本安装实践
Nov 18 Python
Python中返回字典键的值的values()方法使用
May 22 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
学生信息管理系统python版
Oct 17 Python
Django model反向关联名称的方法
Dec 15 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
python获取txt文件词向量过程详解
Jul 05 Python
学python最电脑配置有要求么
Jul 05 Python
Python request post上传文件常见要点
Nov 20 Python
python中time包实例详解
Feb 02 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
yii框架搜索分页modle写法
2016/12/19 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Django中使用locals()函数的技巧
2015/07/16 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
pandas数值计算与排序方法
2018/04/12 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
如何现实servlet的单线程模式
2014/08/05 面试题
生产车间主任的个人自我鉴定
2013/10/25 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
药店促销活动总结
2014/07/10 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
opencv 分类白天与夜景视频的方法
2021/06/05 Python
MySQL 逻辑备份 into outfile
2022/05/15 MySQL