字典創建和可變對象:fromkeys 的令人驚訝的行為
在Python 中使用dict.fromkeys() 創建字典時,可能會出現意外情況當使用可變物件作為值時就會出現這種情況。考慮以下範例:
xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)
儘管創建了兩個單獨的列表物件作為字典鍵 0 和 1 的值,但將元素添加到索引 0 處的列表也會將其添加到索引 1 處的列表。發生這種情況是因為 fromkeys 綁定每個鍵指向可變物件的相同引用,從而導致共享修改。
相較之下,Python 3.2 中的字典推導式表現出不同的行為:
xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)
這裡,每個鍵都綁定到一個不同的列表物件。將元素追加到索引 0 處的清單不會影響索引 1 處的清單。
為什麼會有差異?
fromkeys 的行為可以透過考慮以下等效代碼:
a = []
xs = dict.fromkeys(range(2), a)
結果字典中的每個鍵引用同一個對象,導致觀察到的共享修改。
實現所需的行為每個鍵都有不同的可變對象,請使用字典推導式,或者對於沒有字典推導式的Python 2.6 及更早版本,將dict() 與生成器一起使用表達式:
xs = dict((i, []) for i in range(2))
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3