理解 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

引用計數變為零的情況

當刪除變數 ab 的引用時,引用計數會減少,最終變為零,觸發內存回收。

del a  # 刪除 a 的引用,引用計數 rc = 1
del b  # 刪除 b 的引用,引用計數 rc = 0

刪除 ab 的引用後,該串列的引用計數變為零,Python 會自動釋放該串列佔用的內存空間。

示意圖

a -/-> [1, 2, 3] <-/-> b
# [1, 2, 3] 引用計數 rc = 0,進行內存回收

特殊情況:內建緩衝機制

需要注意的是,Python 對一些常用物件(例如小整數和常用字串)有緩衝機制,即使它們的引用計數降為零,也不會立即回收內存,而是保留在內存中以便重複使用。

這些內建緩衝的物件不受引用計數的影響,以提高程式運行效率。


結語

引用計數機制是 Python 垃圾回收系統中的重要組成部分,負責釋放不再使用的物件內存。

掌握引用計數的運作方式,有助於開發者在程式中高效管理內存資源,避免不必要的內存佔用和洩漏,進而提高程式的效能。

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *