什么是字典视图对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

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

  • dict.items()(和valueskeys):返回一个列表,这样就可以实际存储结果
  • dict.iteritems()(以及类似的):返回一个生成器,这样就可以逐个迭代生成的每个值。

什么是dict.viewitems()?他们的好处是什么?它是怎么工作的?

我读到,这个视图总是反映出字典中的变化。但是从Perf和记忆的角度来看,它是如何表现的呢?赞成和反对的是什么?

提问于
用户回答回答于

字典视图本质上就是它们的名称所表示的:视图就像一个窗口在字典的键和值(或项)上。

>>> 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())

此示例显示视图的动态特性*键视图是在给定时间点的键副本,而是显示键的简单窗口;如果键被更改,则您通过窗口看到的内容也会发生变化。这个特性在某些情况下可能很有用(例如,可以在程序的多个部分上使用一个视图,而不是每次需要时重新计算当前的键列表)。

一个好处是在,比方说,钥匙只使用固定的小内存并要求处理器的一小部分固定时间,因为没有创建键列表(另一方面,Python 2常常不必要地创建一个新列表,如Rajendran T所引用,它占用的内存和时间与列表的长度成正比)。要继续进行窗口类比,如果您想要看到墙后的景观,只需在其中创建一个开口(构建一个窗口);将键复制到列表中将对应于在墙上绘制风景的副本,该副本需要时间、空间,并且不会更新。

总之,视图只是字典上的视图(Windows),即使在字典发生更改之后,它也会显示字典的内容。它们提供与列表不同的特性:键列表包含复制当一个视图是动态的,并且获得的速度更快的时候,因为它不需要复制任何数据(键或值)才能被创建。

用户回答回答于

从阅读文档中,我得到了这样的印象:

  1. 视图是“伪集样”,因为它们不支持索引,所以可以对它们进行成员资格测试和迭代(因为键是可理解和唯一的,所以键和项视图更像“集”,因为它们不包含重复项)。
  2. 可以存储它们并多次使用它们,如列表版本。
  3. 因为它们反映了底层字典,所以字典中的任何更改都将更改视图,并且将几乎可以肯定地改变迭代的顺序。因此,与列表版本不同的是,它们并不是“稳定的”。
  4. 因为它们反映了底层字典,所以它们几乎肯定是小型代理对象;复制键/值/项将要求他们以某种方式查看原始字典,并在发生更改时多次复制它,这将是一个荒谬的实现。因此,我希望内存开销很小,但访问速度比直接访问字典要慢一些。

因此,我想关键的用法是,如果您在字典周围保存一个字典,并在其中反复迭代它的键/项/值,并在两者之间进行修改。你可以用一个视图来代替,转向for k, v in mydict.iteritems():for k, v in myview:.但是,如果你只是重复一次字典,我认为ITER-版本仍然更好。

扫码关注云+社区