文档说values views are not treated as set-like,但有时他们是:
>>> d = {1: 1}
>>> d.values() | d.keys()
{1}
>>> d.values() & d.keys()
{1}
>>> d.values() - d.keys()
set()
为什么要实现返回集合的集合语义,但随后却使用 actual 集合失败?
>>> d.values() - {1}
TypeError: unsupported operand type(s) for -: 'dict_values' and 'set'
答案 0 :(得分:8)
这实际上不是dict_values
处理的操作。 keys_view
将通过支持所反映的方法从右手加强操作:
>>> set().__rsub__({}.values())
NotImplemented
>>> {}.keys().__rsub__({}.values())
set()
出于类似的原因,设置操作有时会与其他dict视图一起起作用或不起作用:
# works, because type(d.items()) implements __rsub__
>>> d.values() - d.items()
{1}
# fails, because type(d.values()) does not implement __rsub__
>>> d.values() - d.values()
TypeError: unsupported operand type(s) for -: 'dict_values' and 'dict_values'
因此,尽管这种行为似乎违反了鸭子输入法,但文档仍然正确。