简短的回答:class dict_values 没有实现 __eq__ 方法,但 class dict_keys 有:
>>> d.values().__eq__(d.values())
NotImplemented
>>> d.keys().__eq__(d.keys())
True
因此,d.values() 的 == 比较结果为 False。
为什么它没有被实现的更长的答案是一个不同的答案,可以在the documentation of dict-view objects 上进行更多的挖掘。这部分似乎特别相关(强调我的):
键视图类似于集合,因为它们的条目是唯一且可散列的。
如果所有值都是可散列的,那么 (key, value) 对是唯一的并且
可散列的,那么项目视图也是类似集合的。 (价值观观点不
被视为类似集合,因为条目通常不是唯一的。)对于
类似集合的视图,为抽象基础定义的所有操作
collections.abc.Set 类可用(例如,==、< 或 ^)。
由于键必须是唯一的,因此它们类似于集合并受collections.Set 的类操作支持是有意义的。由于非唯一性,值不像集合。
在 Python 2.7 中,d.keys() 和 d.values() 两者都返回 list per the documentation,因此如果您尝试 ==,您将获得普通的列表比较。当然,由于不能保证列表按任何特定顺序排列,因此比较实际上并不能满足您的要求,但如果您真的想要,您可以执行比较:
x = {0: 'x', 16: 'x'}
y = {16: 'x', 0: 'x'}
# prints False twice - you'd get True on Python 3.
print x.keys() == y.keys()
print x.items() == y.items()
如果您使用了 viewkeys 和 viewvalues as mentioned in the documentation of dict-view objects in Python2.7,那么您可以期待与 Python 3 类似的行为:
# Python 2.7
from collections import Set
# in Python 3.x this would be from collections.abc import Set
d = {"one": 1}
print isinstance(d.viewkeys(), Set)
# True
print isinstance(d.viewvalues(), Set)
# False
print d.viewkeys() == d.viewkeys()
# True
print d.viewvalues() == d.viewvalues()
# False