python-3.x 字典视图对象与集合

lzfw57am  于 2023-03-24  发布在  Python
关注(0)|答案(1)|浏览(112)

我一直在阅读关于这些字典视图对象的文章,这些对象是由dict.keys()之类的对象返回的,包括这里关于这个主题的帖子。我知道它们充当字典内容的窗口,而不显式地存储所述内容的副本,因此比动态更新键列表更有效。我还发现它们是容器(允许使用in运算符),但它们是not序列(不可索引),尽管它们是**可迭代的。
总的来说,这听起来像是一个set,因为它们可以访问字典的哈希表,它们甚至提供了类似set的操作,如交集/差。我能想到的一个区别是,set,虽然像这些视图对象一样是可变的,但只能存储不可变的(因此是可哈希的)对象。
然而,由于字典 * 值 * 不一定是不可变的,valuesitems视图对象本质上是具有可变内容的set s,支持类似set的操作(减法/交集)。这使我怀疑将这些视图对象视为“引用字典的set”。

**我的问题是:**这些视图对象是否与集合完全不同,但恰好具有相似的属性?或者它们是使用集合实现的?两者之间有任何其他主要差异吗?最重要的是-将它们视为“基本上是set s”会造成损害吗?

w1jd8yoj

w1jd8yoj1#

比较的隐含点是dict.keys()set元素不能有重复,但是,从键获得的类似于集合的Dictionary视图仍然保持顺序,而集合则没有。

字典键重复:

如果一个键出现多次,则该键的最后一个值将成为新字典中的相应值。

重复的集合元素:

集合对象是不同的可散列对象的无序集合。
从上面可以看出,set是无序的,而在当前的Python版本中,字典保持插入顺序:
版本3.7中的变更:字典顺序保证为插入顺序。
因为字典有插入顺序,所以它们可以被颠倒,而在集合中这样的操作是没有意义的:
字典和字典视图是可逆的。
最后,一个set可以被修改,删除和插入。字典视图对象只允许查看内容,不允许修改它们。
我的问题是,这些视图对象是完全不同于集合,但碰巧具有相似的属性?还是它们是使用集合实现的?
文档没有对实现细节做出声明。
两者之间还有其他的主要区别吗?
文档说明了“键视图”和“项视图”或“值视图”之间的区别。

***按键视图***类似于设置(...)

如果所有的值都是可散列的,所以(key,value)对是唯一的和可散列的,那么***items视图***也是类似集合的。
(***值视图***不被视为类集合(...))

相关问题