问题描述
Python 列表嵌套字典时, 出现了修改一个元素后所有元素发生改变的问题,如下所示:
Type "help", "copyright", "credits" or "license" for more information.
>>> aa = [{}]*10
>>> aa
[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
>>> aa[0]['1'] = 1
>>> aa
[{'1': 1}, {'1': 1}, {'1': 1}, {'1': 1}, {'1': 1}, {'1': 1}, {'1': 1}, {'1': 1}, {'1': 1}, {'1': 1}]
>>>
解决方案
- 问题出现的原因是:上面10个字典使用了相同的地址
>>> [id(aa[i]) for i in range(10)]
[140069846191552, 140069846191552, 140069846191552, 140069846191552, 140069846191552, 140069846191552, 140069846191552, 140069846191552, 140069846191552, 140069846191552]
- 因此,使用copy.deepcopy即可解决问题:
>>> import copy
>>> bb = []
>>> [bb.append(copy.deepcopy({})) for i in range(10)]
[None, None, None, None, None, None, None, None, None, None]
>>> bb[0]['1'] = 1
>>> bb
[{'1': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
>>>
总结
使用python, 特别是修改可变对象时,要小心deepcopy的问题。