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 学习笔记
Dec 27 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
python3 pillow模块实现简单验证码
Oct 31 Python
python实现宿舍管理系统
Nov 22 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
Python实现括号匹配方法详解
Feb 10 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
python 实现单例模式的5种方法
Sep 23 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
星际争霸秘籍
2020/03/04 星际争霸
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
canvas绘制多边形
2017/02/24 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
Python networkx包的实现
2020/02/14 Python
台湾家适得:Homeget
2019/02/11 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
组织关系转移介绍信
2014/01/16 职场文书
社会实践活动总结报告
2014/04/29 职场文书
反对邪教标语
2014/06/30 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
内勤岗位职责范本
2015/04/13 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL