字典創建和可變對象: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中文網其他相關文章!