Python向列表添加字典出现数据重复,如何修正代码?
问题:Python字典列表重复引用导致输出不符合预期
我编写的Python代码如下:
data = [] dic = dict.fromkeys(['a', 'b', 'c'], 0) value = 1 for i in range(3): key = list(dic.keys()) for j in range(len(dic)): dic[key[j]] = value value += 1 data.append(dic) for i in data: print(i)
预期输出:
{'a': 1, 'b': 2, 'c': 3} {'a': 4, 'b': 5, 'c': 6} {'a': 7, 'b': 8, 'c': 9}
实际运行结果:
{'a': 7, 'b': 8, 'c': 9} {'a': 7, 'b': 8, 'c': 9} {'a': 7, 'b': 8, 'c': 9}
请问如何修改这段代码以得到预期结果?
解答
问题核心是字典是可变对象,你每次向data列表添加的都是同一个字典对象的引用。后续循环中修改字典时,列表里的所有引用都会指向这个被修改后的字典,所以最终输出全是最后一次修改的结果。
下面提供两种有效修改方案:
方案1:每次循环新建字典
将字典的创建移到外层循环内部,确保每次循环都生成一个全新的字典对象:
data = [] value = 1 for i in range(3): dic = dict.fromkeys(['a', 'b', 'c'], 0) # 每次循环初始化新字典 key = list(dic.keys()) for j in range(len(dic)): dic[key[j]] = value value += 1 data.append(dic) for i in data: print(i)
方案2:添加字典的副本到列表
每次向列表添加时,使用copy()方法创建当前字典的副本,避免引用同一个对象:
data = [] dic = dict.fromkeys(['a', 'b', 'c'], 0) value = 1 for i in range(3): key = list(dic.keys()) for j in range(len(dic)): dic[key[j]] = value value += 1 data.append(dic.copy()) # 添加字典副本而非原对象引用 for i in data: print(i)
两种方案运行后都会得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者cldnjs2085
相关产品推荐
相关产品推荐

