Python中垃圾回收和del语句详解
Python中的垃圾回收算法是采用引用计数,当一个对象的引用计数为0时,Python的垃圾回收机制就会将对象回收
a="larry" b=a
larry这个字符串对象,在第一行被贴了a标签后,引用计数为1,之后在第二行,由贴上了b标签,此时,该字符串对象的引用计数为
a="larry" b=a dela
注意:在Python语言中,del语句操作某个对象的时候,并不是直接将该对象在内存中删除,而是将该对象的引用计数-1
>>>a="larry" >>>b=a >>>dela >>>id(b) 4572141808 >>>id(a) Traceback(mostrecentcalllast): File"",line1,inid(a) NameError:name'a'isnotdefined
从以上示例中可以看出,larry这个字符串对象在第一行被贴上了a标签,此时字符串对象的引用计数为1,接着第二行又被贴上了b标签,此时该字符串对象的引用计数为2,在第三行中,del语言删除了a变量(标签),在后续的print中可以看出,内存中实际的字符串对象并没有被删除,del语言只是删除了一个变量对该字符串对象的引用,所以对于larry这个字符串对象来说,效果只是引用计数-1
魔法函数之__del__
类中的__del__魔法函数,支持我们自定义清理对象的逻辑,当Python解释器使用del语言删除类的对象的时候,会自动调用类中的__del__函数,我们可以对其进行重载
>>>classRef: ... ...def__init__(self,name): ...self.name=name ... ...def__del__(self): ...print("删除对象") ...delself.name ... >>> >>>r=Ref(name="larry") >>>print(r.name) larry >>> >>>delr
删除对象
>>> >>>print(r.name) Traceback(mostrecentcalllast): File"",line1,inprint(r.name) NameError:name'r'isnotdefined
我们可以通过重载__del__魔法函数,自己灵活控制在del对象的时候执行哪些善后操作
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。