python - 什么是字典 View 对象?

在 python 2.7 中,我们得到了 dictionary view methods可用。

现在,我知道以下几点的利弊:

  • dict.items()(和valueskeys):返回一个列表,所以你可以实际存储结果,并且
  • dict.iteritems() (等等):返回一个生成器,因此您可以逐个迭代生成的每个值。

dict.viewitems()(等等)有什么用?他们有什么好处?它是如何工作的?究竟什么是 View ?

我读到 View 总是反射(reflect)字典中的更改。但从性能和内存的角度来看,它的表现如何?有什么好处和坏处?

最佳答案

字典 View 本质上就像它们的名字所说的那样: View 就像一个窗口,位于字典的键和值(或项)上。这是 official documentation 的摘录对于 Python 3:

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> keys  # No eggs anymore!
dict_keys(['sausage', 'bacon', 'spam'])

>>> values  # No eggs value (2) anymore!
dict_values([1, 1, 500])

(Python 2 等效项使用 dishes.viewkeys()dishes.viewvalues()。)

这个例子展示了 View 的动态特性:键 View 不是在给定时间点的键的副本,而是一个简单的窗口,显示你的 key ;如果它们发生了变化,那么您通过窗口看到的内容也会发生变化。此功能在某些情况下可能很有用(例如,可以在程序的多个部分中查看键的 View ,而不是每次需要时重新计算当前键列表)——请注意,如果字典键被修改在对 View 进行迭代时,迭代器的行为方式没有明确定义,这可以 lead to errors .

一个优点是查看键仅使用固定数量的小内存并且需要少量固定的处理器时间,因为没有创建键列表(另一方面,Python 2 经常不必要地创建一个新列表,正如 Rajendran T 所引用的那样,它占用的内存和时间与名单)。继续 window 的类比,如果你想看到墙后的风景,你只需在里面开一个洞(你 build 一扇 window );将键复制到一个列表中相当于在墙上绘制了一幅风景的副本——该副本需要时间、空间,并且不会自行更新。

总而言之, View 只是……字典上的 View (窗口),即使字典发生更改,它也会显示字典的内容。它们提供了与列表不同的功能:键列表包含给定时间点字典键的副本,而 View 是动态的,并且获取速度更快,因为它确实如此无需复制任何数据(键或值)即可创建。

https://stackoverflow.com/questions/8957750/

相关文章:

python - 如何将一串字节转换为int?

python - 重命名 Pandas 中的特定列

python - Python 有包/模块管理系统吗?

linux - GNU screen 没有响应,似乎被阻塞了

linux - 如何在 Ubuntu 中增加 Neo4j 的最大文件打开限制(ulimit)?

linux - 解压 tar.gz 文件

linux - 如何在 linux bash/shell 中对图像进行 base64 编码

python - Django 可选 url 参数

python - 如何检查两个日期之间的差异(以秒为单位)?

linux - 如何强制 'cp' 覆盖目录而不是在里面创建另一个目录?