首頁  >  文章  >  後端開發  >  為什麼有可變物件的「fromkeys」會在 Python 字典中建立共享值?

為什麼有可變物件的「fromkeys」會在 Python 字典中建立共享值?

Patricia Arquette
Patricia Arquette原創
2024-10-26 11:05:29258瀏覽

 Why Does `fromkeys` with Mutable Objects Create Shared Values in Python Dictionaries?

使用fromkeys 和可變物件建立字典:令人驚訝的轉變

Python 中的fromkeys 方法是從鍵序列,全部映射到指定值。但是,當使用可變物件作為值時,可能會發生意外行為。

好奇心

考慮Python 2.6 和3.2 中的以下例子:

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

令我們驚訝的是,修改與第一個鍵([0]) 關聯的列表也會影響與第二個鍵([1]) 相關的列表。這可能會令人費解,因為我們希望每個鍵都有自己獨立的值。

啟示

這種奇怪行為的原因在於 fromkeys 方法建立一個包含對相同可變物件的引用的新字典,而不是建立單獨的副本。換句話說,所有字典條目都指向同一個底層可變物件。

為了避免這個問題,我們可以使用字典推導式,它創建一個新的每個字典鍵的列表:

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

在Python 2.6 及更早版本中,我們可以透過使用帶有生成器表達式的dict() 來實現類似的行為:

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

此替代方法也會建立每個字典鍵都有單獨的列表。

結論

了解使用可變物件建立字典的細微差別對於防止 Python 程式碼中的意外行為和維護資料完整性至關重要。透過選擇適當的方法,我們可以確保字典條目被正確隔離並避免不必要的副作用。

以上是為什麼有可變物件的「fromkeys」會在 Python 字典中建立共享值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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