Python字典视图的用例

Python字典视图的用例,python,dictionary,Python,Dictionary,在阅读了关于Python字典视图的官方文档之后,我仍然缺乏一个像样的用例,这使我理解了它们为什么存在 我们的想法是查看字典,它与创建键/值/项列表有两个主要区别:① 它的创建速度更快(在固定时间内),内存占用量和② 它反映了词典创建后的变化 这是很好的理解,但我缺乏一个想法,当它将是有用的毕竟,无论我在哪里传递这样的视图,我都可以传递字典本身。它也将在固定时间内传递,而不需要额外的内存占用,并且它还将反映自身的变化(当然)。无论我想对视图做什么,我也可以对传递的字典本身做。还是我遗漏了什么 有人

在阅读了关于Python字典视图的官方文档之后,我仍然缺乏一个像样的用例,这使我理解了它们为什么存在

我们的想法是查看字典,它与创建键/值/项列表有两个主要区别:① 它的创建速度更快(在固定时间内),内存占用量和② 它反映了词典创建后的变化

这是很好的理解,但我缺乏一个想法,当它将是有用的毕竟,无论我在哪里传递这样的视图,我都可以传递字典本身。它也将在固定时间内传递,而不需要额外的内存占用,并且它还将反映自身的变化(当然)。无论我想对视图做什么,我也可以对传递的字典本身做。还是我遗漏了什么

有人提到,在字典更改时在字典上使用
iteritems()
iter()
)会使迭代器无效。这是真的。不幸的是,这同样适用于为迭代视图而创建的任何迭代器。所以同样没有区别

那么使用视图有什么好处呢?是否有任何实际用例超出了上面链接的旧问题的范围?

以下是,该提案是受

Python 3中的
dict.keys()
dict.values()
dict.items()
返回字典视图。从后端口到Python 2.7,必须直接调用
dict.viewkeys()
dict.viewvalues()
dict.viewitems()

字典视图像dict一样是可编辑的,它们增加了内存改进,因为它们在迭代时不构建列表。这些好处是微妙的,并融入到语言中

一个直接用例来自字典键视图,其设置类似于

从文档中:

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

keys & {'eggs', 'bacon', 'salad'}
# {'bacon'}

keys ^ {'sausage', 'juice'}
# {'juice', 'sausage', 'bacon', 'spam'}
除了正常的集合操作外,此行为还简化了测试两个字典是否共享公共键的过程


请参阅Brandon Rhodes关于这个主题的文章。

如果第(1)点和第(2)点不能让您相信字典视图的价值,那么这将主要是一个关于观点的讨论。@larsks链接的Q/a线程中没有具体的用例。这仅仅是对它们可能发生的事情的描述。我要一个用例。在某些情况下,我很高兴有这些,因为没有这些,我将有一个问题,没有一个简单的解决方案。@larsks这里的情况有点像一个额外的整数加号运算符(比如说一个名为
add()
的方法,除了名为
的方法之外)。一个人可以记录如何使用它以及它将产生什么结果等。但是如果没有一个用例来解释它们相对于替代品的好处,它们的存在仍然值得怀疑。因此,如果您了解在何种情况下使用它们,因为备选方案不太理想,我很乐意从您那里得到我的问题的答案;任何一个集合操作可以帮助的地方都是一个潜在的用例。As:我们需要更多的动力吗?我认为能够在不必复制的情况下对键和项执行设置操作应该是不言而喻的。我做了一些计时测量(见下面的评论),结果表明使用
set(d)
创建一组键效果很好,特别是比使用
d.viewkeys()
更快。一个用例就足以回答这个问题,所以它肯定不是“太宽泛”。不是所有没有答案的事情都应该搁置。有时它还指出了一个特别难以回答的方面。但是,通过关闭Q,答案是不可能的+3/-2也显示了这个问题的争议性。我做了一些性能测量,比较了
d.viewkeys()&s
set(d)&s
:。使用
viewkeys()
的速度似乎慢了约1.3倍。因此,这个用例也没有帮助,因为它最好使用
set(d)
。感谢您的分析。您可能误解了用例。注意,我没有评论速度
d.viewkeys()
提供了Python 2.7的视图来代替列表。你应该测试一下记忆力。