注意: python3 中的代码示例,但问题也代表 python2(替换.keys
为.viewkeys
等)
dict
对象提供(有时)支持集合操作的视图方法:
>>> {'a': 0, 'b': 1}.keys() & {'a'}
{'a'}
>>> {'a': 0, 'b': 1}.items() & {('a', 0)}
{('a', 0)}
但是值视图不支持集合运算符:
>>> {'a': 0, 'b': 1}.values() & {0}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'dict_values' and 'set'
我知道一个 dict 值可以是一个不可散列的对象,因此并不总是可以创建一组值,但是对于 也是如此dict.items
,并且这里的集合操作只会在运行时失败,因为.items
一旦存在不可散列输入 dict,而 set 操作.values
立即失败。
文档提到Values 视图不被视为 set-like 因为条目通常不是 unique,但这似乎不是一个令人信服的理由 - 例如,python 不会阻止您创建像{0, 0, 1, 2}
.
这种行为不一致的真正原因是什么?