Python:理解字典视图对象

sch*_*tte 7 python dictionary dictview

我一直在试图理解内置视图对象被退回.items().values().keys()在Python 3或类似的.viewitems().viewvalues().viewkeys()。关于该主题还有其他线程,但没有一个(甚至doc)似乎描述了它们在内部是如何工作的。

listPython 2 中返回的类型副本相比,这里的主要收益似乎是高效的。经常将窗口与字典项进行比较(如在此线程中)。

但是那个窗口是什么,为什么它更有效?

我唯一能看到的是,视图对象似乎是 类似集合的对象,对于成员资格测试来说,它们通常更快。但这是唯一的因素吗?

代码示例

>>> example_dict = {'test':'test'}
>>> example_dict.items()
dict_items([('test', 'test')])
>>> type(example_dict.items())
<class 'dict_items'>
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是关于这dict_items门课的。这在内部如何运作?

daw*_*awg 5

主要优点之一是视图是动态的:

>>> di={1:'one',2:'two',3:'three'}
>>> view=di.viewitems()
>>> view
dict_items([(1, 'one'), (2, 'two'), (3, 'three')])
>>> di[2]='new two'
>>> view
dict_items([(1, 'one'), (2, 'new two'), (3, 'three')])
Run Code Online (Sandbox Code Playgroud)

dict.items()因此,如果字典发生更改,您不需要重新生成项目、键或值列表(就像使用 一样)。

将 Python 2 视为dict.items()字典的一种副本——就像制作副本时的样子。

将 Python 3dict.items()或 Python 2 等价物dict.viewitems()视为当前 dict 的最新副本。(显然与 .viewkeys()、.viewvalues() 相同。)

Python 3.6 文档提供了很好的示例,说明为什么以及何时使用 Python 3.6。

值视图不像集合,因为字典可以有重复的值。对于具有可散列值的字典,键视图是类似集合的,项目视图是类似集合的。

注意:在Python 3中,视图取代了Python 2中的视图.keys() .values(),其中.items()一些可能依赖于dict.keys()dict.values()作为字典先前状态的静态表示可能会令人惊讶。


use*_*ica 5

字典视图存储对其父字典的引用,并将视图上的操作转换为字典上的相应操作。

迭代 dict 视图比构建列表并迭代它更有效,因为构建列表需要时间和内存,而您不必花费在视图上。旧的方式,Python 会遍历 dict 的底层存储来构建一个新的列表,然后你会遍历这个列表。迭代 dict 视图使用迭代器直接遍历 dict 的底层存储,跳过不必要的列表步骤。

Dict 视图还支持高效的包含测试和 setlike 交叉/差异/等。操作,因为它们可以在底层 dict 上执行直接哈希查找,而不是遍历列表并逐个元素检查相等性。

如果你想看 CPython 使用的具体实现,你可以去官方仓库看看,但是这个实现可能会发生变化。它已经改变了,反复。

  • @roganjosh:该行指的是字典视图在迭代它时为您提供的迭代器。这并不是说 dict 视图本身就是一个迭代器。 (2认同)