为什么dict_items对象不支持索引?



我知道您可以将dict_items转换为list以允许项目索引。但我不知道为什么不允许直接进行此操作。是因为dict_items对象是生成器吗?如果是这样,当我看到

>>> {"foo": "bar", "baz": "qux"}.items()
dict_items([('foo', 'bar'), ('baz', 'qux')]) 

当调用repr时,Python 是否在评估我的生成器?

dict_items

不支持索引,因为这些对象旨在类似于集合,而集合不支持索引。

他们确实以其他方式像集合一样嘎嘎叫:

>>> d1 = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
>>> d2 = {'k2': 'v2', 'k3': 'not v3'}
>>> d1.items() & d2.items()
{('k2', 'v2')}
>>> d1.items() | d2.items()
{('k1', 'v1'), ('k2', 'v2'), ('k3', 'not v3'), ('k3', 'v3')}

如果任何值不可哈希处理,您将失去使用集合操作处理字典项视图的能力。

dict_items视图提供索引支持是不明智的,因为字典在 Python 3.7+ 之前没有排序,因此访问"第 0 个"项不会很好地定义。即使在 Python 3.7 中,有一个合理的顺序可用于索引(即插入顺序(,以O(1(的复杂性实现这一点也并非易事,因此不受支持。"不成文的规则"是索引应该是常时操作(就像列表,元组,字典,str一样 - 见这里(。

最新更新