揭開dict.fromkeys 和可變物件的神秘面紗
Python 中的dict.fromkeys 函數與可變物件一起使用時可能會出現意外行為,如下例所示:
<code class="python">xs = dict.fromkeys(range(2), []) xs[0].append(1) # xs now contains {0: [1], 1: [1]} instead of {0: [1], 1: []}</code>
令人困惑的行為
這種行為似乎與字典理解相矛盾,字典理解為每個鍵保留不同的值:
<code class="python">xs = {i: [] for i in range(2)} xs[0].append(1) # xs still contains {0: [1], 1: []}</code>
理解差異
主要區別在於這兩種方法創建字典的方式。在 Python 2.6(及更早版本)中,dict.fromkeys 為所有鍵引用相同的可變對象,而字典推導式為每個鍵創建不同的對象。
結果是當 xs[0] 在第一個中發生突變時例如,變更反映在 xs[1] 中,因為它們引用相同的列表物件。相反,在第二個範例中,列表是不同的,因此改變 xs[0] 不會影響 xs[1]。
避免意外
避免對於這種意外行為,建議盡可能使用字典推導式。如果字典推導式不可用(例如,在 Python 2.6 中),則可以使用帶有 dict 函數的生成器表達式來建立不同的物件:
<code class="python">xs = dict((i, []) for i in range(2))</code>
以上是以下是一些標題選項,涉及“神秘”和“意外行為”方面: * 為什麼 `dict.fromkeys` 對可變物件的行為如此奇怪? *`d之謎的詳細內容。更多資訊請關注PHP中文網其他相關文章!