Python中修改字典列表元素异常:结果与预期不符如何解决?
问题分析与解决方案
问题原因
你当前的代码里,leg = [d for i in range(2)]并没有创建两个独立的字典,而是把同一个字典对象d的引用重复添加到了列表里。也就是说,leg[0]和leg[1]指向的是内存中同一个字典。所以当你第一次循环修改leg[0]['sym']时,字典内容变成A0;第二次循环修改leg[1]['sym']时,其实还是修改同一个字典,把A0改成了A01,最后打印的两个元素自然都是同一个字典的内容。
修复方案
有两种常见的正确写法:
方案1:直接在推导式中创建新字典
每次循环生成一个全新的字典,确保列表元素是独立对象:
leg = [{'sym':'A'} for i in range(2)] for i in range(2): leg[i]['sym'] = leg[i]['sym']+str(i) print(leg)
方案2:复制原字典
如果原字典d内容复杂,不想重复编写,可以用dict.copy()创建原字典的浅拷贝,让每个列表元素都是独立字典:
d={'sym':'A'} leg = [d.copy() for i in range(2)] for i in range(2): leg[i]['sym'] = leg[i]['sym']+str(i) print(leg)
两种方式运行后都会输出预期结果:[{'sym': 'A0'}, {'sym': 'A1'}]
内容的提问来源于stack exchange,提问作者PUJA DUTTA
相关产品推荐
相关产品推荐

