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

Gamila ·
更新时间:2024-09-21
· 864 次阅读

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对象销毁实例(垃圾回收)



del 垃圾回收 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号