考虑一下:
>>> a = {'foo': {'bar': 3}}
>>> b = {'foo': {'bar': 3}}
>>> a == b
True
根据python doc,you can indeed use字典上的==
运算符。
这里到底发生了什么? Python是否递归检查字典的每个元素以确保相等?它是否确保键完全匹配,并且值也相同匹配?
是否有文档准确指定字典上==
的含义?或者我是否必须实现我自己的检查相等的版本?
(如果==
运算符有效,为什么不能使用dicts?也就是说,为什么我不能创建一个dicts的set(),或者使用dict作为字典键?)
答案 0 :(得分:18)
Python以递归方式检查字典的每个元素以确保相等。请参阅C dict_equal()
implementation,它检查每个键和值(假设词典的长度相同);如果字典b
具有相同的密钥,则PyObject_RichCompareBool
测试值是否也匹配;这本质上是一个递归调用。
字典不可清除,因为它们__hash__
attribute is set to None
,而且最重要的是它们是可变的,当用作字典键时不允许使用它。
如果您要使用字典作为键,并通过现有引用然后更改密钥,那么该密钥将不再插入哈希表中的相同位置。使用另一个相等的字典(相当于未更改的字典或更改的字典)来尝试检索该值现在将不再起作用,因为将选择错误的插槽,或者密钥将不再相等。
答案 1 :(得分:16)
来自docs:
映射(字典)比较相等,当且仅当它们已排序 (键,值)列表比较相等。[5]除了相等之外的结果 一致地解决,但没有另外定义。 [6]
脚注[5]:
实现有效地计算它,而不构造 列表或排序。
脚注[6]:
早期版本的Python使用了排序的词典比较 (键,值)列表,但这对于常见的情况非常昂贵 比较平等。比较早期的Python版本 只有身份的词典,但这引起了惊喜,因为 人们期望能够通过测试字典的空虚 将它与{}进行比较。
答案 2 :(得分:4)
如果每个键具有相同的键和相同的值,则字典相等。
参见一些例子:
dict(a=1, b=2) == dict(a=2, b=1)
False
dict(a=1, b=2) == dict(a=1, b=2, c=0)
False
dict(a=1, b=2) == dict(b=2, a=1)
True