python坑:陣列中需要多個字典型時使用乘號複製多個空字典的問題
阿新 • • 發佈:2019-02-19
在需要多個空dict時,我們可以使用語法:[{}]*n 來複製出陣列中包含n個空dict的內容,如複製3個空dict到陣列中:
>>> [{}]*3
[{}, {}, {}]
從結果看,的確複製了三個空字典,但是我們在對其分別賦值時,會出現對第一個dict操作,後面所有的內容都被賦予同樣內容的問題。
>>> d = [{}]*3 [{}, {}, {}] >>> d[0]['name'] = 'python' >>> d [{'name': 'python'}, {'name': 'python'}, {'name': 'python'}]
那麼問題出在哪呢?這是因為使用乘號(*)複製時,只是複製了三個索引,即複製的n個索引都指向同一個實體地址,所以我們在操作其中任何一個時,都會同時修改其他內容。
要避免該問題,必須要對每個dict單獨定義,即每個dict單獨擁有一塊記憶體空間,所以可以如下方法解決:
>>> n = 3 ... d = [] ... while n > 0: ... d.append({}) ... n -= 1 >>> d [{}, {}, {}] >>> d[0]['name'] = 'python' >>> d [{'name': 'python'}, {}, {}]