Python中字典合并是日常开发的高频操作,不同的合并方式有着不同的特性和适用场景,本文将对update方法、|操作符、**操作符三种常见合并方式进行详细对比。

三种合并方式的基础用法
1. update方法合并
update是字典对象的内置方法,用于将一个字典的键值对更新到当前字典中,如果键已存在则会覆盖原有值。
# 定义两个待合并的字典
dict1 = {"name": "张三", "age": 20}
dict2 = {"age": 25, "city": "北京"}
# 使用update方法合并,直接修改dict1
dict1.update(dict2)
print(dict1) # 输出:{"name": "张三", "age": 25, "city": "北京"}
2. | 操作符合并
| 操作符是Python 3.9及以上版本新增的字典合并语法,会返回一个新的合并后的字典,不会修改原字典。
dict1 = {"name": "张三", "age": 20}
dict2 = {"age": 25, "city": "北京"}
# 使用|操作符合并,生成新字典
new_dict = dict1 | dict2
print(new_dict) # 输出:{"name": "张三", "age": 25, "city": "北京"}
print(dict1) # 输出:{"name": "张三", "age": 20},原字典未被修改
3. ** 操作符合并
**操作符可以将字典解包为键值对,结合字典字面量可以生成新的合并字典,兼容所有Python 3.x版本。
dict1 = {"name": "张三", "age": 20}
dict2 = {"age": 25, "city": "北京"}
# 使用**操作符合并,生成新字典
new_dict = {**dict1, **dict2}
print(new_dict) # 输出:{"name": "张三", "age": 25, "city": "北京"}
print(dict1) # 输出:{"name": "张三", "age": 20},原字典未被修改
三种方式的核心差异对比
从返回值、原字典修改、版本兼容性、重复键处理四个维度对比三种方式的差异:
| 对比维度 | update方法 | | 操作符 | ** 操作符 |
|---|---|---|---|
| 返回值 | 无返回值(None) | 返回新的合并字典 | 返回新的合并字典 |
| 原字典是否修改 | 是,直接修改调用方法的字典 | 否,原字典保持不变 | 否,原字典保持不变 |
| 版本兼容性 | 所有Python版本支持 | 仅Python 3.9及以上版本支持 | 所有Python 3.x版本支持 |
| 重复键处理 | 后面的字典键覆盖前面的 | 后面的字典键覆盖前面的 | 后面的字典键覆盖前面的 |
适用场景分析
- 如果需要直接修改原字典,且不关心返回值,优先选择
update方法,语法简洁执行效率高。 - 如果使用的是Python 3.9及以上版本,且需要生成新字典不修改原数据,推荐使用
|操作符,语法直观可读性更强。 - 如果需要兼容低版本Python,同时需要生成新合并字典,选择
**操作符是最稳妥的方案。
注意事项
使用update方法时需要注意,该方法没有返回值,如果将其返回值赋值给变量,会得到None,这是新手常犯的错误。
另外三种方式处理重复键的规则一致,都是后出现的字典键值对覆盖先出现的,合并前需要确认键的优先级是否符合业务预期。
# 错误示例:将update返回值赋值
dict1 = {"a": 1}
dict2 = {"b": 2}
result = dict1.update(dict2)
print(result) # 输出:None,不是合并后的字典