溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中垃圾回收和del語(yǔ)句詳解

發(fā)布時(shí)間:2020-10-16 08:34:29 來(lái)源:腳本之家 閱讀:124 作者:Polar Snow Documenta 欄目:開(kāi)發(fā)技術(shù)

Python中的垃圾回收算法是采用引用計(jì)數(shù), 當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)為0時(shí), Python的垃圾回收機(jī)制就會(huì)將對(duì)象回收

a = "larry"
b = a

larry這個(gè)字符串對(duì)象, 在第一行被貼了a標(biāo)簽后, 引用計(jì)數(shù)為1, 之后在第二行, 由貼上了b標(biāo)簽, 此時(shí), 該字符串對(duì)象的引用計(jì)數(shù)為

a = "larry"
b = a
del a

注意: 在Python語(yǔ)言中, del語(yǔ)句操作某個(gè)對(duì)象的時(shí)候, 并不是直接將該對(duì)象在內(nèi)存中刪除, 而是將該對(duì)象的引用計(jì)數(shù)-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這個(gè)字符串對(duì)象在第一行被貼上了a標(biāo)簽, 此時(shí)字符串對(duì)象的引用計(jì)數(shù)為1, 接著第二行又被貼上了b標(biāo)簽, 此時(shí)該字符串對(duì)象的引用計(jì)數(shù)為2, 在第三行中, del語(yǔ)言刪除了a變量(標(biāo)簽), 在后續(xù)的print中可以看出, 內(nèi)存中實(shí)際的字符串對(duì)象并沒(méi)有被刪除, del語(yǔ)言只是刪除了一個(gè)變量對(duì)該字符串對(duì)象的引用, 所以對(duì)于larry這個(gè)字符串對(duì)象來(lái)說(shuō), 效果只是引用計(jì)數(shù)-1

魔法函數(shù)之__del__

類中的__del__魔法函數(shù), 支持我們自定義清理對(duì)象的邏輯, 當(dāng)Python解釋器使用del語(yǔ)言刪除類的對(duì)象的時(shí)候, 會(huì)自動(dòng)調(diào)用類中的__del__函數(shù), 我們可以對(duì)其進(jìn)行重載

>>> class Ref:
...
...   def __init__(self, name):
...     self.name = name
...
...   def __del__(self):
...     print("刪除對(duì)象")
...     del self.name
...
>>>
>>> r = Ref(name="larry")
>>> print(r.name)
larry
>>>
>>> del r

刪除對(duì)象

>>>
>>> print(r.name)
Traceback (most recent call last):
 File "<input>", line 1, in <module>
  print(r.name)
NameError: name 'r' is not defined

我們可以通過(guò)重載__del__魔法函數(shù), 自己靈活控制在del 對(duì)象的時(shí)候執(zhí)行哪些善后操作

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI