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



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

的但是,对于字典中的值,如果它是可变类型 - 例如:list,那么==在列表值中元素的顺序方面如何工作?

是的,顺序对于有序类型很重要。这不是关于可变或不可变。字典和集合都是可变的,并且在概念上是无序的(即使字典恰好保留了广告顺序(。

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

如果您将有序类型(例如列表(作为字典中的值,则字典项可以按任意顺序排列,但列表本身中的元素必须具有相同的顺序,以使两个字典被视为相等。

例如

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

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

然而:

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

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

因为字典本质上是无序

请注意,它们不是从 3.7 开始的(它们是插入顺序的,就像列表一样(。

== 在列表值中元素的顺序方面如何工作?

您可以按给定的顺序逐个元素进行比较。如果有任何不同,那么它就是不同的。

如果值是可变类型

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

您将可变性与有序与否混淆了。 集合是可变的,但是是无序的(顺序无关紧要(。

这个问题的答案与dict__eq__(==调用(的实现无关,因为它被委托给值类型对__eq__的实现。

简而言之,如果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               

相关内容

最新更新