考虑:
>>> a = {'foo': {'bar': 3}} >>> b = {'foo': {'bar': 3}} >>> a == b True
据蟒蛇文档,你的确可以使用该==辞书运营商。
==
这里到底发生了什么?Python是否递归检查字典的每个元素以确保相等?是否确保键完全匹配,并且值也完全匹配?
是否有文档确切说明==字典的含义?还是我必须实现自己的版本的相等性检查?
(如果==运算符起作用,为什么字典不能散列?也就是说,为什么我不能创建字典的set()或将字典用作字典键?)
Python递归检查字典的每个元素以确保相等。参见C dict_equal()实现,该实现检查每个键和值(假设字典的长度相同);如果字典b具有相同的键,则PyObject_RichCompareBool测试值是否也匹配;这本质上是一个递归调用。
dict_equal()
b
PyObject_RichCompareBool
字典不可散列,因为其__hash__属性设置为None,并且大多数字典都是 可变的 ,当用作字典键时是不允许的。
__hash__
None
如果要使用字典作为键,并通过现有引用更改键,则该键将不再插入哈希表中的相同位置。现在,使用另一个相等的字典(等于未更改的字典或已更改的字典)尝试检索值将不再起作用,因为将选择错误的插槽,或者键将不再相等。