我发现比较内置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
中有一些实现细节,这会导致这种奇怪的行为。
是否有这种行为的原因,或者我偶然发现了一些晦涩的错误?
答案 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.Set
和d.keys()
两者都返回list
per the documentation,因此该限制不适用。由于它们都是同一类型的对象,因此在两个对象上执行相同的操作是有意义的。如果您使用了d.values()
和viewkeys
as mentioned in the documentation of dict-view objects in Python2.7,那么您可以预期会有类似的行为:
viewvalues