為什麼清單上的 Python = 運算子會產生意外的共享狀態行為?
Dec 14, 2024 pm 05:08 PM= 運算子在清單上的意外行為
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 尊渡假赌尊渡假赌尊渡假赌
擊敗分裂小說需要多長時間?
3 週前
By DDD
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
擊敗分裂小說需要多長時間?
3 週前
By DDD
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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