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

Python3合并嵌套字典时如何实现修改新字典不影响原字典

嵌套字典合并后修改同步污染原字典问题

复现场景

使用Python3的|运算符合并两个嵌套字典,合并操作本身执行成功,但对合并后新字典的嵌套键做修改时,改动会同步作用于两个原始字典,预期原始字典完全不发生变化。
复现代码如下:

dict1 = {'key_val_1': {'a': '1', 'b': '2', 'c': '3'}}
dict2 = {'key_val_2': {'d': '4', 'e': '5', 'f': '6'}}

dict3 = dict1 | dict2

for x in dict3:
    dict3[x]['g'] = '7'

上述代码执行后,键值对'g': '7'会同时出现在dict1、dict2、dict3三个字典的嵌套子字典中,不符合仅修改dict3的预期。

根本原因

Python中字典的|运算符实现的是浅拷贝合并,拷贝规则如下:

  • 仅会为合并后的最外层字典创建新的独立内存空间
  • 内层嵌套的子字典,仍然是对原始字典中对应子对象的引用,没有生成独立副本
    因此修改dict3内层的子字典时,本质是在操作和原始字典共享的同一个子对象,改动自然会同步反映到原始字典上。

解决方法

要实现新字典和原始字典完全隔离、修改互不影响,需要对合并的字典做深拷贝处理,递归生成所有层级对象的独立副本后再合并。

通用实现(支持任意层级嵌套)

使用标准库copy的deepcopy方法,完全切断新老对象的引用关联:

import copy

dict1 = {'key_val_1': {'a': '1', 'b': '2', 'c': '3'}}
dict2 = {'key_val_2': {'d': '4', 'e': '5', 'f': '6'}}

# 对两个原字典做深拷贝后再合并
dict3 = copy.deepcopy(dict1) | copy.deepcopy(dict2)

for x in dict3:
    dict3[x]['g'] = '7'

执行后验证:dict1和dict2会保持初始状态,仅dict3的嵌套子字典新增'g': '7'键值对。

轻量实现(仅1层嵌套场景)

如果明确字典只有1层嵌套,不需要引入deepcopy,手动拷贝内层子对象即可:

dict3 = {k: v.copy() for k, v in dict1.items()} | {k: v.copy() for k, v in dict2.items()}

注意:如果嵌套层级超过2层,轻量写法仍然会存在内层引用共享的问题,必须使用深拷贝方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:27:24