==运算符实际上对Python字典做了什么?

时间:2013-06-20 15:05:54

标签: python dictionary

考虑一下:

>>> a = {'foo': {'bar': 3}}
>>> b = {'foo': {'bar': 3}}
>>> a == b
True

根据python doc,you can indeed use字典上的==运算符。

这里到底发生了什么? Python是否递归检查字典的每个元素以确保相等?它是否确保键完全匹配,并且值也相同匹配?

是否有文档准确指定字典上==的含义?或者我是否必须实现我自己的检查相等的版本?

(如果==运算符有效,为什么不能使用dicts?也就是说,为什么我不能创建一个dicts的set(),或者使用dict作为字典键?)

3 个答案:

答案 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