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

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

Dec 14, 2024 pm 05:08 PM

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

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

我如何使用美麗的湯來解析HTML? 我如何使用美麗的湯來解析HTML? Mar 10, 2025 pm 06:54 PM

我如何使用美麗的湯來解析HTML?

python中的圖像過濾 python中的圖像過濾 Mar 03, 2025 am 09:44 AM

python中的圖像過濾

如何使用Python查找文本文件的ZIPF分佈 如何使用Python查找文本文件的ZIPF分佈 Mar 05, 2025 am 09:58 AM

如何使用Python查找文本文件的ZIPF分佈

如何使用Python使用PDF文檔 如何使用Python使用PDF文檔 Mar 02, 2025 am 09:54 AM

如何使用Python使用PDF文檔

如何在django應用程序中使用redis緩存 如何在django應用程序中使用redis緩存 Mar 02, 2025 am 10:10 AM

如何在django應用程序中使用redis緩存

如何使用TensorFlow或Pytorch進行深度學習? 如何使用TensorFlow或Pytorch進行深度學習? Mar 10, 2025 pm 06:52 PM

如何使用TensorFlow或Pytorch進行深度學習?

python對象的序列化和避難所化:第1部分 python對象的序列化和避難所化:第1部分 Mar 08, 2025 am 09:39 AM

python對象的序列化和避難所化:第1部分

如何在Python中實現自己的數據結構 如何在Python中實現自己的數據結構 Mar 03, 2025 am 09:28 AM

如何在Python中實現自己的數據結構

See all articles