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
相关产品推荐
相关产品推荐

