Python 3.x和Python 2.7中dict.values()和dict.keys()相等性之间的行为不一致

时间:2019-03-06 15:37:18

标签: python python-3.x python-2.7

我发现比较内置keys()的{​​{1}}和values()方法的结果会导致结果不一致:

dict

在Python 2.7中运行上述代码将对两个调用都返回True,这使我相信Python 3的instance = {'one': 1} instance.values() == instance.values() # Returns False instance.keys() == instance.keys() # Returns True 中有一些实现细节,这会导致这种奇怪的行为。

是否有这种行为的原因,或者我偶然发现了一些晦涩的错误?

1 个答案:

答案 0 :(得分:48)

简短的答案:class dict_values没有实现__eq__的方法,但是class dict_keys却有:

>>> d.values().__eq__(d.values())
NotImplemented
>>> d.keys().__eq__(d.keys())
True

因此,d.values()的{​​{1}}比较结果为==

为什么的未实现的更长的答案是一个不同的答案,可以通过在the documentation of dict-view objects上进行更多的挖掘来看出。这部分似乎特别相关(强调我的意思):

  

键视图的设置方式类似,因为它们的条目是唯一的且可哈希化。   如果所有值都是可哈希的,那么(键,值)对是唯一的,并且   可散列,则项目视图也类似于集合。 (值视图不是   因为条目通常不是唯一的,所以被视为集合。)   集式视图,为抽象库定义的所有操作   类False可用(例如collections.abc.Set==<

由于键必须是唯一的,因此它们具有相似的设置并受^的类操作支持是有意义的。由于存在非唯一性,因此值的设置不一样。

但是在Python 2.7中,collections.Setd.keys() 两者都返回list per the documentation,因此该限制不适用。由于它们都是同一类型的对象,因此在两个对象上执行相同的操作是有意义的。如果您使用了d.values()viewkeys as mentioned in the documentation of dict-view objects in Python2.7,那么您可以预期会有类似的行为:

viewvalues