Python 物件的記憶體位置與調用行為完整教學

更新於 發佈於 閱讀時間約 6 分鐘

1. 什麼是物件的記憶體位置?

在 Python 中,每個物件在記憶體中都有一個唯一的位置,這個位置可以用 id() 函式查詢。

這個 id 在 CPython(最常見的 Python 實作)中,實際上就是物件的記憶體地址。

a = [1, 2, 3]
print(id(a)) # 印出物件 a 的記憶體位置
print(hex(id(a))) # 轉成 16 進位,更像記憶體位址

2. 物件的記憶體位置何時會改變?

(1) 同一個物件,id 不會變

只要你沒有重新指派,物件的 id 就不會變:

a = [1, 2, 3]
print(id(a)) # 例如:140123456789456
a.append(4)
print(id(a)) # 還是同一個 id

(2) 重新賦值,id 會變

如果你把變數指向新的物件,id 就會改變:

a = [1, 2, 3]
print(id(a)) # 140123456789456
a = [4, 5, 6] # a 指向新的 list
print(id(a)) # 另一個 id,例如 140123456789888

(3) 多個變數指向同一個物件

a = [1, 2, 3]
b = a
print(id(a), id(b)) # 兩個 id 一樣

3. 變數、物件、記憶體的關係

  • 變數:只是物件的「名字」或「參照」。
  • 物件:真正存在記憶體中的資料。
  • id():查詢物件的記憶體位置(地址)。

圖解:

a ──► [1, 2, 3]  (物件在 0x7fffaabbccdd)
b ──┘

4. 重新調用(重新賦值)時的記憶體刷新

當你把變數指向新物件(例如 a = [4, 5, 6]),

  • 原本的物件如果沒其他變數參照,就會被 Python 的垃圾回收機制釋放。
  • 變數 a 會指向新物件,id(a) 也會變。

5. 不同型態的物件行為

(1) 不可變物件(immutable)

如 intstrtuple,每次改變內容都會產生新物件:

x = 10
print(id(x))
x += 1
print(id(x)) # id 變了

(2) 可變物件(mutable)

如 listdict,內容改變但 id 不變:

lst = [1, 2]
print(id(lst))
lst.append(3)
print(id(lst)) # id 不變

6. NumPy 陣列的記憶體位置

NumPy 陣列有兩個重點:

  • id(arr):Python 物件的記憶體位置
  • arr.ctypes.data:底層資料的記憶體位置
import numpy as np

arr = np.zeros((3, 3), dtype=np.uint8)
print(id(arr)) # Python 物件 id
print(hex(arr.ctypes.data)) # 資料起始位址

7. 記憶體釋放與垃圾回收

(1) 只要還有參照,記憶體就不會釋放

  • Python 會自動管理記憶體。只要有變數參照著一個物件,這個物件就會一直存在於記憶體中。
  • 即使你不再使用這個物件,只要有變數還指向它,記憶體就不會被釋放。
a = [1, 2, 3]
# 只要 a 還在,這個 list 就會一直佔用記憶體

(2) 沒有參照時,才會自動釋放(垃圾回收)

  • 沒有任何變數參照這個物件時,Python 的垃圾回收機制(Garbage Collector, GC)會自動釋放這塊記憶體。
  • 你可以用 del 刪除變數,或讓變數指向其他物件,原本的物件如果沒被其他變數參照,就會被回收。
a = [1, 2, 3]
b = a
del a # b 還在,所以記憶體不會釋放
del b # 沒有參照了,list 會被釋放

(3) 程式結束時,所有記憶體都會被釋放

  • 當 Python 程式結束時,所有物件都會自動釋放,不用手動清理。

8. 常見誤區

  • 誤區 1:以為不用的物件會自動釋放。
    只要還有變數參照,記憶體就不會釋放。
  • 誤區 2:用 del 就能馬上釋放記憶體。
    只有當所有參照都消失,記憶體才會被釋放。

9. 小結

  • 物件的記憶體會一直被占用,只要有變數參照它。
  • 沒有參照時,Python 會自動釋放記憶體。
  • 程式結束時,所有記憶體都會自動釋放。

10. 範例說明

import sys

a = [1, 2, 3]
b = a
print(sys.getsizeof(a)) # 查看記憶體用量

del a
# b 還在,記憶體還沒釋放

del b
# 現在沒有參照,list 會被釋放

11. 延伸閱讀

留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
153會員
297內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
介紹如何用assign函數在Python中建立新欄位
Thumbnail
介紹如何用assign函數在Python中建立新欄位
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
Thumbnail
在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News