首頁  >  文章  >  後端開發  >  為什麼 `dict.fromkeys()` 在 Python 中建立共享可變物件?

為什麼 `dict.fromkeys()` 在 Python 中建立共享可變物件?

Patricia Arquette
Patricia Arquette原創
2024-10-25 16:27:02148瀏覽

 Why does `dict.fromkeys()` create shared mutable objects in Python?

字典創建和可變對象:fromkeys 的令人驚訝的行為

在Python 中使用dict.fromkeys() 創建字典時,可能會出現意外情況當使用可變物件作為值時就會出現這種情況。考慮以下範例:

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)</code>

儘管建立了兩個單獨的列表物件作為字典鍵0 和1 的值,但將元素新增至索引0 處的清單也會將其新增至索引1 處的列表。發生這種情況是因為 fromkeys 將每個鍵綁定到可變物件的相同引用,從而導致共享修改。

相反,Python 3.2 中的字典推導式表現出不同的行為:

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)</code>

這裡,每個key 綁定到不同的列表物件。將元素追加到索引 0 處的清單不會影響索引 1 處的清單。

為什麼會有差異?

可以透過考慮以下方式來理解fromkeys 的行為:以下等效程式碼:

<code class="python">a = []
xs = dict.fromkeys(range(2), a)</code>

結果字典中的每個鍵都引用相同的對象,從而導致觀察到的共享修改。

為每個鍵實現不同可變物件的所需行為,使用字典推導式,或者,對於沒有字典推導式的Python 2.6 及更早版本,將dict() 與生成器表達式一起使用:

<code class="python">xs = dict((i, []) for i in range(2))</code>

以上是為什麼 `dict.fromkeys()` 在 Python 中建立共享可變物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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