= 運算子在清單上的意外行為
Python 中的 =運算子在對清單進行操作時會出現意外行為,如以下程式碼所示程式碼片段:
class foo: bar = [] def __init__(self, x): self.bar += [x] class foo2: bar = [] def __init__(self, x): self.bar = self.bar + [x] f = foo(1) g = foo(2) print(f.bar) print(g.bar)
輸出:
[1, 2] [1, 2]
= 運算符似乎會影響該類別的每個實例,而foo = foo bar 的行為符合預期。
此行為源自於 = 運算子的底層實作。它首先嘗試呼叫 iadd 特殊方法,該方法用於就地添加並修改它所作用的物件。如果 iadd 不可用,則會回退到 add 特殊方法,該方法傳回一個新物件。
對於列表,僅 add 被定義,它會傳回一個新列表。因此,當在列表上使用 = 時,它會建立一個新列表,而不是改變現有列表。這解釋了為什麼 f 和 g 在上面的範例中共享相同的 bar 清單。
= 運算子對於可變物件的行為有所不同,它透過 iadd 方法就地修改它們。對於字串和整數等不可變對象,只有 add 可用,從而建立一個新物件。
總結:
以上是為什麼清單上的 Python = 運算子會產生意外的共享狀態行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!