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

ohe*_*ohe 7 python dictionary

我知道您可以强制dict_items转换list为允许项目索引.但我不知道为什么不允许直接进行此操作.是因为dict_items物体是发电机吗?如果是这样的话,当我看到的时候

>>> {"foo": "bar", "baz": "qux"}.items()
dict_items([('foo', 'bar'), ('baz', 'qux')]) 
Run Code Online (Sandbox Code Playgroud)

repr什么时候调用Python来评估我的生成器?

wim*_*wim 10

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')}
Run Code Online (Sandbox Code Playgroud)

如果任何值不可清除,则您将无法使用set操作处理dict项视图.

dict_items视图提供索引支持是不明智的,因为在Python 3.7+之前dict没有排序,因此访问"第0个"项目将无法很好地定义.即使在Python 3.7,那里一个明智的顺序使用索引(即插入顺序),它是不平凡一起实现这个O(1)复杂性,所以它不支持."不成文规则"是索引应该是恒定时间操作(就像列表,元组,字典,str一样 - 参见这里).

  • 这实际上是一个比我给出的更好的理由"它不受支持,因为它没有支持它":) (4认同)
  • 好答案.要理解`用O(1)复杂度来实现它是非常重要的,请参见[this answer](/sf/answers/3675557021/)和注释. (3认同)
  • 威姆(Wim):您是如何学习有关未记录类型的所有信息的?只是通过实验还是阅读CPython源代码? (2认同)