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

Python嵌套字典修改异常:为何修改单个条目会影响多个子字典?

嵌套字典修改时多子层级同步变化的原因与解决方法

问题现象

手动创建嵌套字典时,修改单个子层级条目不会影响其他子字典:

d1 = {'a': {0: [1,2], 1: [1,2]}, 'b': {0: [1,2], 1: [1,2]}}
d1['a'][2] = [2,2]
# 结果:{'a': {0: [1, 2], 1: [1, 2], 2: [2, 2]}, 'b': {0: [1, 2], 1: [1, 2]}}

但用dict.fromkeys()动态创建字典后,修改操作会同时影响所有子字典:

d2 = dict.fromkeys(['a','b'], dict.fromkeys([0,1], [1,2]))
d2['a'][2] = [2,2]
# 结果:{'a': {0: [1, 2], 1: [1, 2], 2: [2, 2]}, 'b': {0: [1, 2], 1: [1, 2], 2: [2, 2]}}

原因分析

dict.fromkeys()的第二个参数是单个对象的引用,所有键都会共享这个对象。
在d2 = dict.fromkeys(['a','b'], dict.fromkeys([0,1], [1,2]))中:

  • 'a'和'b'对应的是同一个子字典对象,而非各自独立的新字典
  • 同理,子字典里的0和1也共享同一个列表[1,2]的引用

所以修改d2['a']时,本质是修改了那个共享的子字典,自然会同步到d2['b']。
而手动创建的d1中,每个{0: [1,2], 1: [1,2]}都是单独创建的新字典对象,彼此独立,修改互不影响。

解决方法

要确保每个键对应独立的对象,避免引用共享,有两种常用方式:

1. 使用字典推导式

为每个外层键生成独立的子字典,同时为子字典的每个键生成独立的列表:

# 外层字典推导式,每个key对应新的子字典
d2 = {key: {sub_key: [1,2].copy() for sub_key in [0,1]} for key in ['a','b']}

2. 用循环逐个构建

通过循环逐个创建独立的子字典和列表,彻底避免引用共享:

d2 = {}
for key in ['a','b']:
    sub_dict = {}
    for sub_key in [0,1]:
        # 每次都创建新的列表对象
        sub_dict[sub_key] = [1,2].copy()
    d2[key] = sub_dict

执行修改操作d2['a'][2] = [2,2]后,就能得到预期结果:

{'a': {0: [1, 2], 1: [1, 2], 2: [2, 2]}, 'b': {0: [1, 2], 1: [1, 2]}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:05:30