当值是像列表这样的可变类型时,两个字典的 == 比较如何工作(顺序很重要)?
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
当我们在 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