Python字典初始化顺序:浅拷贝后键值覆盖的可靠性疑问
字典解包时的键覆盖规则
答案是肯定的,{**d, 1: 11} 里 d[1] 一定会被后面的 1:11 覆盖,这个行为是确定的,和字典本身的顺序无关:
- 字典字面量的处理逻辑是按书写顺序依次处理每个元素:先解析
**d,把原字典d的所有键值对导入新字典;再处理后面的1: 11,如果该键已存在(也就是d包含键1),就会覆盖之前的对应值。 - 这是Python语法明确规定的行为,哪怕是在3.7版本之前字典无序的时期,这个覆盖规则依然生效——不管原字典
d里的键顺序如何,只要在**d之后写了同名键的新值,就会覆盖前面导入的内容。 - 反过来,
{1: 11, **d}这种写法是先添加1:11,再导入d的键值对,此时d里的键1会覆盖前面的1:11,最终保留的是原字典的对应值。
用你的代码示例佐证:
d = {1: 1, 2: 2} d1 = {1: 11, **d} # 结果 {1: 1, 2: 2},d的键1覆盖了先写的1:11 d2 = {**d, 1: 11} # 结果 {1: 11, 2: 2},后写的1:11覆盖了d的键1
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

