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

Python 3.7+中dict()与OrderedDict()的相等性判断为何结果不同?

为什么Python 3.7+的dict和OrderedDict相等性判断行为不一致?

先来看你给出的这段代码,在Python 3.7.5里的运行结果确实和你描述的一样:

from collections import OrderedDict

# 普通dict测试
d1 = dict()
d2 = dict()
d1['a'] = 1
d1['b'] = 2
d2['b'] = 2
d2['a'] = 1
print(d1 == d2)  # 输出: True

# OrderedDict测试
d3 = OrderedDict()
d4 = OrderedDict()
d3['a'] = 1
d3['b'] = 2
d4['b'] = 2
d4['a'] = 1
print(d3 == d4)  # 输出: False

很多人会误以为3.7+的dict和OrderedDict完全等价,但其实两者对“字典相等”的定义是不一样的,这才是导致结果差异的核心原因:

1. 普通dict的相等性判断逻辑

从Python诞生以来,普通字典的相等性判断就只看键值对的集合是否完全一致,完全不关心键的插入顺序——哪怕3.7版本开始官方保证了dict会保留插入顺序,这个相等性的规则也没有改变。

换句话说,只要两个dict包含的所有键和对应的值都一模一样,不管你是按什么顺序插入的,==都会返回True。这是dict的本质属性决定的:它的核心是哈希表,用来快速查找键对应的值,顺序从来都不是它定义“相等”的一部分,只是3.7之后额外保证了插入顺序的保留而已。

2. OrderedDict的相等性判断逻辑

OrderedDict最初是为了在Python 3.7之前的版本中提供“有序字典”的功能而设计的,它的核心特性就是插入顺序是其身份的一部分。所以在判断两个OrderedDict是否相等时,不仅会检查键值对是否完全匹配,还会严格对比键的插入顺序——只要顺序不一样,哪怕键值对完全相同,==也会返回False。

另外,OrderedDict还提供了一些普通dict没有的、和顺序相关的方法(比如move_to_end()),这也能看出它对“顺序”的重视程度远高于普通dict。

额外补充

如果想要让两个普通dict也按顺序进行相等性判断,你可以手动比较它们的items()序列:

print(list(d1.items()) == list(d2.items()))  # 输出: False

但这只是手动实现的逻辑,并不是普通dict默认的相等性判断规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:07:29