91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-10-09 17:55:41 來源:億速云 閱讀:116 作者:iii 欄目:編程語言

本篇內容介紹了“Python垃圾回收機制中的引用計數是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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垃圾回收機制中的引用計數是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长岭县| 民勤县| 泸州市| 怀远县| 宜章县| 泗水县| 萝北县| 镇原县| 南丰县| 东丽区| 贡觉县| 金坛市| 通海县| 玉田县| 乐安县| 乌什县| 木兰县| 邻水| 贡山| 中江县| 府谷县| 庆阳市| 西乡县| 潮州市| 曲阳县| 肥东县| 华坪县| 巴彦淖尔市| 葫芦岛市| 威海市| 涟源市| 宾阳县| 南召县| 林口县| 张家口市| 丰都县| 汝阳县| 泊头市| 兴山县| 准格尔旗| 六盘水市|