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

Python:含列表值的字典转字典列表时值覆盖的原因

问题原因与解决方法

为什么最终列表里两个字典的b都是2?

因为Python里字典是可变对象,当你写tmp_dict = example时,并没有复制出一个新字典,只是让tmp_dict和example指向了内存中同一个字典对象。

第一次循环时,你修改tmp_dict["b"] = 1,其实是直接修改了原example字典,此时把它添加到列表里;第二次循环修改tmp_dict["b"] = 2,还是修改同一个原字典,再添加一次。最后列表里的两个元素都是指向同一个字典,自然显示的都是最后一次修改后的结果。

正确的实现方式

每次循环都要创建一个原字典的副本,而不是直接引用原字典:

方法1:使用字典的copy()方法

example = {"a":1,"b":[1,2]}
iter_items = example.get("b")
new_list = []

for p in iter_items:
    tmp_dict = example.copy()  # 复制出一个新字典
    tmp_dict["b"] = p
    new_list.append(tmp_dict)

print(new_list)
# 输出:[{"a":1,"b":1},{"a":1,"b":2}]

方法2:使用dict()构造函数创建副本

example = {"a":1,"b":[1,2]}
iter_items = example.get("b")
new_list = []

for p in iter_items:
    tmp_dict = dict(example)  # 生成新字典
    tmp_dict["b"] = p
    new_list.append(tmp_dict)

print(new_list)

方法3:用字典推导式简化代码

example = {"a":1,"b":[1,2]}
new_list = [{"a": example["a"], "b": p} for p in example["b"]]
print(new_list)

内容的提问来源于stack exchange,提问作者akmalharith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:25:35