当值是像列表这样的可变类型时,两个字典的 == 比较如何工作(顺序很重要)?

How does == comparison of 2 dictionaries work when the value is a mutable type like list (does order matter)?

当我们在 2 个字典上使用 == 运算符时,它会检查每个字典是否具有相同的 key/values 而不管顺序如何,因为 dict 本质上是无序的

但是,对于 dict 中的值,如果它是可变类型 - 例如:列表,那么 == 如何按照列表值中元素的顺序工作?

是的,顺序对于有序类型很重要。这与可变或不可变无关。 Dict 和 set 都是可变的,概念上 无序(即使 dict 恰好保留插入顺序)。

列表(和元组)是有序的,所以两个列表是相等的,因为它们具有相同的顺序。

如果你有一个有序类型(例如列表)作为字典中的值,那么字典中的项目可以是任何顺序,但列表本身中的元素必须是相同的顺序,对于两个dicts 被认为是平等的。

例如

{'A':[1,2], 'B':[3,4]} == {'B':[3,4], 'A':[1,2]}

字典在概念上是无序的,这两个字典描述的是相同的内容(顺序不同)。

但是:

{'A':[1,2]} != {'A':[2,1]}

列表是有序的,所以字典中的两个列表不相等;因此字典不相等。

since dict is inherently unordered

请注意,自 3.7 以来它们不是(它们是按插入顺序排列的,如列表)。

how does the == work in terms of order of elements in the list value?

您按照给定的顺序逐个元素进行比较。如有不同,则不同。

if the value is a mutable type

可变与否无关紧要,元组同样适用于列表。

您将可变性与有序与否混为一谈。集合是可变的但无序的(顺序无关紧要)。

这个问题的答案与 __eq__dict 实现(== 调用)无关,因为它被委托给 [=12 的值类型的实现=].

简单的说,如果v1 == v2那么{'a': v1} == {'a': v2}.

[1, 2] != [2, 1] 所以 {'a': [1, 2]} != {'a': [2, 1}.

同样,{1, 2} == {2, 1} 所以 {'a': {1, 2} == {'a': {2, 1}}

我没有检查 dict.__eq__ 的 C 实现,但它可能等同于(可能有一些更花哨的优化):

if len(d1) != len(d2):
    # dicts don't have same # of keys, can't be equal
    return False

for k1, v1 in d1.items():
    try:
        v2 = d2[k1]
    except KeyError:
        # d2 does not have a key that d1 has, can't be equal
        return False       

    # delegating the check to the value's type implementation of ==    
    if v1 != v2:
         # d1 and d2 have the same key but the value is different, can't be equal           
        return False      

# all keys and values in d1 and d2 are equal, so dicts are equal    
return True