1. 程式人生 > >python坑:陣列中需要多個字典型時使用乘號複製多個空字典的問題

python坑:陣列中需要多個字典型時使用乘號複製多個空字典的問題

    在需要多個空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'}, {}, {}]