Python 怎么把两个字典合并?三种最常用的方法讲清楚

编程狮(w3cschool.cn) 2026-08-14 16:26:41 浏览数 (25)
反馈

你手上有两份配置:一份是默认设置,一份是用户自定义的。现在想把两个字典合成一个——用户的值覆盖默认的,缺的就用默认的。比如默认主题色是蓝、用户改成红,合并后就该是红。这种“字典合并”的需求在 Python 里特别常见,比如读配置、拼参数、整合接口返回的数据。在 Python 合并字典这件事上,选对写法能让代码既短又不容易出错。把两个字典合并,办法不止一种:最直观的是用 {a, b} 解包写法,想原地改原字典可以用 update 方法,Python 3.9 之后还多了个更清爽的 | 合并运算符。今天这篇文章,编程狮就把 Python 怎么把两个字典合并讲清楚,并说清重复键到底谁覆盖谁。

一、什么是字典合并:先把场景想清楚

所谓合并字典,就是把两个 dict 里的键值对汇总到一个新字典里。这里最关键的规则是:当两个字典出现同一个键时,后合并进来的值会覆盖前面的。理解这一点,你就不会对“为什么某个配置没生效”感到意外。

💡 小提示:合并和“往里加一项”不是一回事。合并是整体叠加两个字典,而 dict 的单个赋值只是改某一个键。日常说“合并字典”,通常指前者。

在动手之前,先想清楚你要的是“生成一个新字典、不动原来的”,还是“直接改掉其中一个”。这两类需求对应的写法不一样。很多初学者一听“合并”就想到手写循环,其实 Python 早就把这事封装好了,不需要你写 for。理解清楚“要新字典还是要改原值”,下面三种写法一眼就能选。想系统学 Python 字典 的用法,那篇里把键值对结构讲得很透,建议配套看。

二、方法一:{a, b} 解包(最直观)

最直观的写法,是利用字典解包把两个字典“拆开再拼起来”:

a = {"x": 1, "y": 2}
b = {"y": 3, "z": 4}
c = {**a, **b}
print(c)  # {'x': 1, 'y': 3, 'z': 4}

这里 a 把 a 的键值对展开, b 把 b 的键值对展开,b 写在后面,所以键 y 被 b 的值 3 覆盖。最终生成的是新字典 c,原来的 a 和 b 都没被改动。

⚠️ 注意:这种写法生成的是“新字典”,适合你不想破坏原始数据的场景。如果你其实想直接改 a,那就该看下面的 update。

解包写法读起来一眼就懂,是很多 Python 开发者合并字典时的首选。它的好处是“所见即所得”:你一眼就能看出结果是哪两个字典拼的,而且原字典 a、b 完全没动,后续还能继续用。它也是三种写法里可读性最高的,团队代码评审时最不容易被挑刺。

三、方法二:update 方法(原地修改)

如果你想直接把 b 的内容合并进 a 本身,用 update 最合适:

a = {"x": 1, "y": 2}
a.update({"y": 3, "z": 4})
print(a)  # {'x': 1, 'y': 3, 'z': 4}

update 会把参数里的键值对写进调用它的字典,重复键同样被覆盖。和第一种写法不同,这里 a 被原地改掉了,没有产生第三个字典。它返回值是 void(也就是什么都不返回),所有改动直接落在调用对象上。如果你后面还要用原来的 a,记得先拷贝一份再 update,否则原数据就被覆盖了。这也是为什么多人协作时,用 update 最好写注释说明“此处会改动原对象”,避免同事误以为 a 还保持旧值。

💡 小提示:update 不仅能接字典,还能接键值对组成的列表、甚至关键字参数。合并字典这件事,update 是最“老牌”也最稳妥的办法。

关于字典在实战里的更多玩法,Python 列表去重 那篇就用到了字典来辅助统计,可以对照着拓宽思路。

四、方法三:| 合并运算符(3.9+ 最清爽)

Python 3.9 引入了新的合并运算符 |,让合并字典变得格外干净:

a = {"x": 1, "y": 2}
b = {"y": 3, "z": 4}
c = a | b
print(c)  # {'x': 1, 'y': 3, 'z': 4}

| 返回的是新字典,a 和 b 都不动;键冲突同样以右边的 b 为准。如果你用的是 3.9 及以上版本,这个写法既短又清楚,可读性最好。如果你的运行环境还停留在 Python 3.8 或更早,别硬上 |,解释器会直接报语法错误;退化到解包或 update 才是正解。

⚠️ 注意:| 运算符只在 Python 3.9 之后才有。老版本解释器里写 a | b 会直接报错,这种情况下请退回方法一或方法二。

五、重复键谁覆盖,以及三种方法怎么选

三种方法在“重复键覆盖”上规则一致:后出现的覆盖先出现的。区别只在于“是否产生新字典”和“语法繁简”:

  • 要新字典、不改原值 → {a, b} 或 a | b;
  • 要直接改原字典 → update;
  • 版本够新、追求清爽 → 优先 |。

一句话总结:合并字典时,键冲突永远右边赢;选哪种写法,看你要不要保住原始字典。补充一句:这三种方法对嵌套字典都只是“浅合并”,也就是只合并最外层;如果某个键对应的值本身又是字典,后者的整个内层字典会直接替换前者,而不是递归合并。要做深层合并得自己写递归,或借助第三方库。

总结

把两个字典合并,Python 给了三种常用办法:{a, b} 解包生成新字典最直观,update 原地改原字典最稳妥,| 运算符在 3.9+ 上最清爽。三者对重复键的处理一致——后合并的值覆盖先前的。

记住“冲突看右边、改不改原值自己选”,你就能在任意场景里把字典合并用对。字典合并看似琐碎,却是日常 Python 代码里高频出现的基础操作,用熟这三种写法,配置拼接、参数整合这类活儿都会干净利落很多。

常见问题

Q:合并后原来的两个字典会变吗?
A:用 {a, b} 和 | 合并时,原字典都不动,结果是个新字典;只有 update 会原地修改调用它的那个字典。想要保留原始数据,就选前两种。

Q:三个及以上字典怎么合并?
A:可以连续解包 {a, b, **c},或连续用 | 串起来 a | b | c,规则一样:越靠后优先级越高,重复键被最后出现的覆盖。

Q:Python 3.8 能用 | 合并运算符吗?
A:不能。| 是 Python 3.9 才加入的。老版本请用 {a, b} 解包或 update 方法,效果完全相同。

延伸学习

想把 Python 基础打牢,可以按这个顺序来:

  1. 先过一遍 Python3 教程,把字典、解包、运算符这些根基铺平;
  2. 语法记不住时,Python 速查手册 能随时翻查;
  3. 想跟着视频边学边练,Python3零基础入门到爬虫实战 是循序渐进的形式,适合巩固上手。

0 人点赞