Python 垃圾回收機制中的引用計數

王林
發布: 2023-04-10 13:51:08
轉載
1297 人瀏覽過

Python 中的 __del__ 魔法方法,也被稱為物件的終結者,是一個在物件即將被移除記憶體之前被呼叫的方法。它實際上並不做從記憶體中刪除物件的工作,我們將在後面看到它是如何發生的。相反,這個方法是用來做任何在物件被移除前需要發生的清理工作。例如,關閉物件在建立時開啟的任何檔案。

在本節中,我們將使用下面這個類別作為範例。

class MyNameClass:
def __init__(self, name):
self.name = name

def __del__(self):
print(f"Deleting {self.name}!")
登入後複製

在上面的例子中,我們已經定義了我們的類別在初始化時接受一個名字的輸入,當呼叫 finaliser 時,它會透過列印相關實例的名字讓我們知道。這樣,我們就可以了解哪些物件被從記憶體中刪除,以及何時被刪除。

那麼,CPython 什麼時候會決定從記憶體中刪除一個物件呢?有兩種方式(從CPython 3.10 開始)會發生這種情況:引用計數和垃圾回收。

引用計數

如果我們在 Python 中有一個指向某個物件的指針,那就是對該物件的引用。對於一個給定的物件 a ,CPython 會追蹤有多少其他東西指向 a 。如果這個計數器達到零,就可以安全地從記憶體中刪除這個對象,因為沒有其他東西在使用它。讓我們來看一個例子。

>>> Harward = MyNameClass("Harward")
>>> del Harward
Deleting Harward!
>>>
登入後複製

在這裡,我們建立了一個新的物件(MyNamedClass("Harward")),並建立了一個指向它的指標(Harward =)。然後,當我們刪除 Harwade 時,我們刪除了這個引用,MyNamedClass 實例現在的引用計數為 0。所以,CPython 決定從記憶體中刪除它--而且,就在這之前,它的 __del__ 方法被調用,印出了我們看到的上面的資訊。

如果我們對一個物件創建了多個引用,我們將不得不擺脫所有的引用,以便使該物件被刪除。

>>> bob = MyNameClass("Bob")
>>> bob_two = bob # creating a new pointer to the same object
>>> del bob # this doesn't cause the object to be removed...
>>> del bob_two # ... but this does
Deleting Bob!
登入後複製

當然,我們的 MyNamedClass 實例本身可以包含指針--畢竟它們是任意的 Python 對象,我們可以為它們添加任何我們喜歡的屬性。讓我們來看一個例子。

>>> jane = MyNamedClass("Jane")
>>> bob = MyNamedClass("Bob")
>>> jane.friend = bob # now the "Jane" object contains a pointer to the "Bob" object...
>>> bob.friend = jane
登入後複製

我們在上面的程式碼片段中所做的是設定了一些循環引用。名字為 Jane 的物件包含一個指向名字為 Bob 的物件的指針,反之亦然。當我們做下面的事情時,情況就變得有趣了。

>>> del jane
>>> del bob
登入後複製

我們現在已經刪除了從命名空間到物件的指標。現在,我們完全無法存取那些 MyNameClass 物件了--但我們並沒有收到告訴我們它們即將被刪除的列印資訊。這是因為這些物件仍有引用,包含在彼此之間,因此它們的引用計數不是 0 。

我們在這裡創建的是一個循環隔離體;在這個結構中,每個物件在循環中至少有一個引用,使其保持活力,但循環中的所有物件都不能從命名空間中被訪問。

循環隔離的直覺表現

下面是我們建立一個循環隔離時的直覺表現。

首先,我們建立兩個對象,每個對像在命名空間中都有一個名字。

Python 垃圾回收機制中的引用計數

接下來,我們透過在每個物件上新增一個指標來連接我們的兩個物件。

Python 垃圾回收機制中的引用計數

最後,我們透過刪除兩個物件的原始名稱來從命名空間中刪除指標。在這一點上,這兩個物件從名字空間中是不可訪問的,但每個物件都包含一個指向另一個物件的指針,所以它們的引用計數不是零。

Python 垃圾回收機制中的引用計數

所以,很明顯,引用計數本身並不足以保持在執行時間的工作記憶體中沒有無用的、不可回收的物件。這就是CPython的垃圾收集器發揮作用的地方。

以上是Python 垃圾回收機制中的引用計數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板