使用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中文網其他相關文章!