编辑:可能重复。只有在发布此问题并查看“相关问题”之后,我才能找到为什么在类似集合的对象上不支持像 .intersection() 这样的集合方法?,这个问题可能足够相似,可以重复。
我试图查看字典中的键是否是集合的子集,并且遇到了dict_keys
视图对象和集合方法/运算符的一些令人困惑的行为。
集合和视图之间的区别指出:
只有 dict.keys() 字典视图始终是一个集合(它的行为类似于一个集合,但具有字典的实时视图)
https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects文档指出
键视图类似于集合,因为它们的条目是唯一且可散列的。... 对于类似集合的视图,为抽象基类 collections.abc.Set 定义的所有操作都可用(例如,==、< 或 ^)。
并且https://docs.python.org/2/library/stdtypes.html#set设置类型文档意味着运算符(<=、| 等)等同于方法.issubset()
等union()
。
然而,以下代码并未反映这些断言:
> dic = {'first': 'a', 'second': 'b'}
> s = {'first', 'second', 'third'}
> dic.keys() <= s
True
> dic.keys().issubset(s)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-354-fbf8f9744a80> in <module>
----> 1 dic.keys().issubset(s)
AttributeError: 'dict_keys' object has no attribute 'issubset'
s.issuperset(dic.keys())
但是确实返回True
。
当所有迹象都表明 .issubset() 方法可以工作时,为什么会出现分散行为?