理解 Python 中的引用計數機制(Reference Counting)
更新日期: 2024 年 11 月 16 日
Python 採用多種機制來管理內存,其中最基本的內存管理方式之一是「引用計數機制」(Reference Counting)。
引用計數有助於自動釋放不再使用的物件,從而避免內存佔用。
本文將解釋引用計數的工作原理,並通過範例展示其在 Python 程式中的應用。
引用計數的原理
每當 Python 中創建一個新物件時,會初始化一個引用計數(Reference Count,簡稱 rc
)來追踪該物件的引用次數。
引用計數增加或減少的情況如下:
- 增加引用計數:當新變數指向該物件時。
- 減少引用計數:當變數不再指向該物件(例如刪除變數或重新賦值)時。
當物件的引用計數降為零,Python 便會回收該物件的內存空間,以釋放資源。
引用計數的應用範例
以下範例演示了引用計數如何隨著變數引用的增加或刪除而變化。
範例:引用計數的變化
a = [1, 2, 3] # 初始時,串列 [1, 2, 3] 的引用計數 rc = 1
b = a # b 指向 a,引用計數增加,rc = 2
在上述程式碼中,變數 a
創建了一個包含 [1, 2, 3]
的串列物件,因此該串列的引用計數為 1。
當 b
被設置為 a
的引用時,引用計數增加為 2,因為現在有兩個變數,同時指向這個串列。
示意圖
a -----> [1, 2, 3] <----- b
引用計數變為零的情況
當刪除變數 a
和 b
的引用時,引用計數會減少,最終變為零,觸發內存回收。
del a # 刪除 a 的引用,引用計數 rc = 1
del b # 刪除 b 的引用,引用計數 rc = 0
刪除 a
和 b
的引用後,該串列的引用計數變為零,Python 會自動釋放該串列佔用的內存空間。
示意圖
a -/-> [1, 2, 3] <-/-> b
# [1, 2, 3] 引用計數 rc = 0,進行內存回收
特殊情況:內建緩衝機制
需要注意的是,Python 對一些常用物件(例如小整數和常用字串)有緩衝機制,即使它們的引用計數降為零,也不會立即回收內存,而是保留在內存中以便重複使用。
這些內建緩衝的物件不受引用計數的影響,以提高程式運行效率。
結語
引用計數機制是 Python 垃圾回收系統中的重要組成部分,負責釋放不再使用的物件內存。
掌握引用計數的運作方式,有助於開發者在程式中高效管理內存資源,避免不必要的內存佔用和洩漏,進而提高程式的效能。