首頁 >後端開發 >Python教學 >為什麼清單上的 Python = 運算子會產生意外的共享狀態行為?

為什麼清單上的 Python = 運算子會產生意外的共享狀態行為?

Linda Hamilton
Linda Hamilton原創
2024-12-14 17:08:18875瀏覽

Why Does Python's  = Operator on Lists Produce Unexpected Shared-State Behavior?

= 運算子在清單上的意外行為

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 可用,從而建立一個新物件。

總結:

  • = 使用 iadd(如果已定義),修改物件就地。
  • 如果未定義 iadd,= 回退到 __add__,建立一個新物件。
  • 對於可變對象,= 就地修改對象.
  • 對於不可變對象,= 建立一個新對象。

以上是為什麼清單上的 Python = 運算子會產生意外的共享狀態行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn