You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:05:20