搜尋
首頁後端開發Python教學Python 垃圾回收機制中的引用計數

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

Apr 10, 2023 pm 01:51 PM
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 垃圾回收機制中的引用計數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:51CTO.COM。如有侵權,請聯絡admin@php.cn刪除
Python的科學計算中如何使用陣列?Python的科學計算中如何使用陣列?Apr 25, 2025 am 12:28 AM

Arraysinpython,尤其是Vianumpy,ArecrucialInsCientificComputingfortheireftheireffertheireffertheirefferthe.1)Heasuedfornumerericalicerationalation,dataAnalysis和Machinelearning.2)Numpy'Simpy'Simpy'simplementIncressionSressirestrionsfasteroperoperoperationspasterationspasterationspasterationspasterationspasterationsthanpythonlists.3)inthanypythonlists.3)andAreseNableAblequick

您如何處理同一系統上的不同Python版本?您如何處理同一系統上的不同Python版本?Apr 25, 2025 am 12:24 AM

你可以通過使用pyenv、venv和Anaconda來管理不同的Python版本。 1)使用pyenv管理多個Python版本:安裝pyenv,設置全局和本地版本。 2)使用venv創建虛擬環境以隔離項目依賴。 3)使用Anaconda管理數據科學項目中的Python版本。 4)保留系統Python用於系統級任務。通過這些工具和策略,你可以有效地管理不同版本的Python,確保項目順利運行。

與標準Python陣列相比,使用Numpy數組的一些優點是什麼?與標準Python陣列相比,使用Numpy數組的一些優點是什麼?Apr 25, 2025 am 12:21 AM

numpyarrayshaveseveraladagesoverandastardandpythonarrays:1)基於基於duetoc的iMplation,2)2)他們的aremoremoremorymorymoremorymoremorymoremorymoremoremory,尤其是WithlargedAtasets和3)效率化,效率化,矢量化函數函數函數函數構成和穩定性構成和穩定性的操作,製造

陣列的同質性質如何影響性能?陣列的同質性質如何影響性能?Apr 25, 2025 am 12:13 AM

數組的同質性對性能的影響是雙重的:1)同質性允許編譯器優化內存訪問,提高性能;2)但限制了類型多樣性,可能導致效率低下。總之,選擇合適的數據結構至關重要。

編寫可執行python腳本的最佳實踐是什麼?編寫可執行python腳本的最佳實踐是什麼?Apr 25, 2025 am 12:11 AM

到CraftCraftExecutablePythcripts,lollow TheSebestPractices:1)Addashebangline(#!/usr/usr/bin/envpython3)tomakethescriptexecutable.2)setpermissionswithchmodwithchmod xyour_script.3)

Numpy數組與使用數組模塊創建的數組有何不同?Numpy數組與使用數組模塊創建的數組有何不同?Apr 24, 2025 pm 03:53 PM

numpyArraysareAreBetterFornumericalialoperations andmulti-demensionaldata,而learthearrayModuleSutableforbasic,內存效率段

Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Apr 24, 2025 pm 03:49 PM

numpyArraySareAreBetterForHeAvyNumericalComputing,而lelethearRayModulesiutable-usemoblemory-connerage-inderabledsswithSimpleDatateTypes.1)NumpyArsofferVerverVerverVerverVersAtility andPerformanceForlargedForlargedAtatasetSetsAtsAndAtasEndCompleXoper.2)

CTYPES模塊與Python中的數組有何關係?CTYPES模塊與Python中的數組有何關係?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingingangandmanipulatingc-stylarraysinpython.1)usectypestoInterfacewithClibrariesForperfermance.2)createc-stylec-stylec-stylarraysfornumericalcomputations.3)passarraystocfunctions foreforfunctionsforeffortions.however.however,However,HoweverofiousofmemoryManageManiverage,Pressiveo,Pressivero

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具