當賦值和增強不同時:探索「i = x」與「i = i x」
= 運算子的使用Python 在某些情況下可能會導致意外行為。讓我們檢查 i = x 和 i = i x 之間的差異,以了解它們何時發散。
理解運算子重載
= 運算子呼叫iadd 方法(如果存在),或add 方法(如果) iadd 不可用。相反,此運算子主要呼叫 add 方法。
可變物件與不可變物件
= 的行為取決於物件是否是分配是可變的(可以變更)或不可變的(無法變更) 。對於不可變對象,= 和建立一個新實例。然而,iadd修改了原始物件並將其賦回變數名,覆蓋了先前的引用。
範例:Lists
來說明差異,請考慮以下程式碼:
a = [1, 2, 3] b = a b += [1, 2, 3] print(a) # [1, 2, 3, 1, 2, 3] print(b) # [1, 2, 3, 1, 2, 3]
由於清單是可變的,因此= 會修改b 到位,這會影響a,因為兩個變數引用相同的列表。
現在,考慮:
a = [1, 2, 3] b = a b = b + [1, 2, 3] print(a) # [1, 2, 3] print(b) # [1, 2, 3, 1, 2, 3]
在這種情況下,b = b [1, 2, 3] 建立一個新名單,保持不變。這是因為呼叫 add 方法,該方法傳回一個新實例。
' =' 的異常處理
在x. __add__ 未實現或返回NotImplemented,並且x 和y 具有不同的類型,運算符將依賴y.__radd__ (如果存在)。因此,以下是等效的:
foo_instance += bar_instance
foo_instance = bar_instance.__radd__(bar_instance, foo_instance)
子類重寫
當foo_instance 和bar_instance 是不同類型,並且bar_instance 是foo_instance 的子類別時, bar_instance.__radd__ 將在foo_instance.__add__之前嘗試。這允許子類別覆蓋其超類別的行為。
結論
理解 i = x 和 i = i x 之間的差異對於避免 Python 程式設計中出現意外結果至關重要。透過了解這些運算符何時以及如何表現不同,您可以有效地操作不可變和可變物件。
以上是什麼時候`i = x`和`i = i x`在Python中產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!