發表文章

Class Variables 演練與變數記憶體關係範例

圖片
class Counter:      total = 0      def __init__(self):           Counter.total += 1 a = Counter() b = Counter() c = Counter() print(Counter.total) 測試重點詳解: 類別變數 total 的定義與初始化: total = 0 定義在 class Counter: 區塊內,而不是在任何方法(如 __init__)中,這使得 total 成為一個類別變數。 特性: 所有透過 Counter 類別建立的物件(實例,如 a、b、c)都會共享這同一個 total 變數。 __init__ 構造函數中的操作: def __init__(self): 是在物件被建立時自動呼叫的方法。 Counter.total += 1 確保了每當一個 Counter 類別的物件被建立時,共享的類別變數 total 的值就會增加 1。 程式碼執行過程: a = Counter():建立第一個物件,Counter.total 變為 0 + 1 = 1。 b = Counter():建立第二個物件,Counter.total 變為 1 + 1 = 2。 c = Counter():建立第三個物件,Counter.total 變為 2 + 1 = 3。 最終輸出: print(Counter.total) 最終會輸出 3。 但是,更進階一點,如果程式寫成下面的方式 class Counter:     total = 0     def __init__(self):           print(f"Counter.total={Counter.total}, id={id(Counter.total)}")          Counter.total += 1         self.total += 2     ...

Python 變數是參考還是值?用實驗帶你看懂

在學習 Python 的過程中,常常有人會問: Python 變數是 傳值 (by value) 還是 傳參考 (by reference)? 為什麼有時候改變一個變數,另一個也跟著變了? 為什麼 += 和 + 看似相同,卻會造成不同結果? 本文將用一段簡單程式碼,帶你理解 Python 的 變數綁定機制 以及 mutable vs immutable 的差異。 在 Python 中,所有東西都是物件 (object)。 變數只是「名稱 (name) → 物件 (object)」的綁定。 本質上永遠是 reference,但行為會因 mutable 或 immutable 而不同。 Immutable 型別:int, float, str, tuple … 不可變,任何修改都會生成新物件。 Mutable 型別:list, dict, set, 自訂 class … 可變,修改會直接影響同一個物件。 以下是程式範例: a = [1] print(a) b = a print(type(a), type(b)) print(a, b) print(id(a), id(b)) b += [2] print(a, b) print(id(a), id(b)) b.append(3) print(a, b) print(id(a), id(b)) b = b + [4] print(a, b) print(id(a), id(b)) 而你可以觀察到 print 出來的結果會是: >>> [1] >>> <class 'list'> <class 'list'> >>> [1] [1] >>> 139702957538944 139702957538944 >>> [1, 2] [1, 2] >>> 139702957538944 139702957538944 >>> [1, 2, 3] [1, 2, 3] >>> 139702957538944 139702957538944 >>> [1, 2, 3] [1, 2, 3, 4] >>> 1...