Python中垃圾回收和del语句详解

作者:Polar Snow Documentation 时间:2023-12-20 01:02:55 

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 对象的时候执行哪些善后操作

来源:https://docs.lvrui.io/2018/08/01/Python%E4%B8%AD%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%92%8Cdel%E8%AF%AD%E5%8F%A5/

标签:Python,垃圾回收,del语句
0
投稿

猜你喜欢

  • Nodejs进阶:express+session实现简易登录身份认证

    2024-05-11 09:51:28
  • Go语言基础if条件语句用法及示例详解

    2024-04-23 09:35:16
  • 商品评论的设计

    2009-12-23 13:06:00
  • Pytorch模型的保存/复用/迁移实现代码

    2023-12-12 10:37:43
  • Linux下修改MySQL数据库数据文件路径的步骤

    2024-01-19 13:53:41
  • python基础之多态

    2022-04-05 10:06:06
  • 基于 Mysql 实现一个简易版搜索引擎

    2024-01-25 02:00:38
  • Go语言模拟while语句实现无限循环的方法

    2024-05-09 09:45:48
  • python实现高斯投影正反算方式

    2022-11-17 08:58:19
  • 用python实现操纵mysql数据库插入

    2024-01-16 01:15:41
  • php之Aes加密案例讲解

    2023-06-11 12:59:12
  • ASP怎么谈到应用到类的?

    2008-03-10 11:21:00
  • 关于Mysql-connector-java驱动版本问题总结

    2024-01-19 02:07:58
  • 全方位清理浮动

    2009-06-16 14:51:00
  • python设置代理和添加镜像源的方法

    2022-12-03 10:26:39
  • Golang实现字符串倒序的几种解决方案

    2024-01-30 20:01:37
  • 浅谈python抛出异常、自定义异常, 传递异常

    2022-12-22 00:49:31
  • 一分钟带你掌握Python中pip的安装与使用方法

    2021-02-10 10:38:12
  • python中正则表达式 re.findall 用法

    2023-10-03 21:59:18
  • js动态生成form 并用ajax方式提交的实现方法

    2024-04-17 09:59:54
  • asp之家 网络编程 m.aspxhome.com