首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >你能用PyDictValues_Type做什么?

你能用PyDictValues_Type做什么?
EN

Stack Overflow用户
提问于 2016-10-12 17:56:26
回答 2查看 129关注 0票数 1

在尝试将一些Python/C代码转换为在2和3中工作时,我发现,考虑到下面的Python

代码语言:javascript
代码运行次数:0
运行
复制
DICT = { … }

class Example(object):
  ITEMS = DICT.values()

然后调用PyObject_GetAttrString(an_example, "ITEMS")将产生一个PySequence_Check在2.7中返回true的PyObject。现在,在3.4中,它生成了一个PyObject,它的类型是PyDictValues_Type,而PySequence_Check不返回true。关于PyDictValues的文档是稀疏的。一个人能用它做什么?它还对PyIter_Check响应为false。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-12 18:21:21

在Python2中,dict.values()返回一个列表,但在Python3中,它是字典值的视图。Python2.7中的等价物是dict.viewvalues()

特别地,视图不是序列,因为字典没有命令。所以dict.viewkeys()dict.viewitems()是设置类似的,因为键必须是唯一的。dict.viewvalues()是多集式的.您可以对其进行迭代,获取长度,并对其进行包含检查。但你不能像序列一样索引它。

票数 2
EN

Stack Overflow用户

发布于 2016-10-12 18:20:36

基本上就是iter (C中的PyObject_GetIter)。

从技术上讲,还有其他操作,如== (从object继承而来,无趣)、len (但如果需要,您可以在dict上调用它而不是创建值视图)和in (慢速线性扫描,避免它),但值视图的主要用途是可迭代的。

如果您想要一个像Python2这样的列表,那么在dict上使用call调用PyDict_Values而不是调用values方法仍然会生成一个列表。

键和项视图(keys()items())更有趣。它们支持collections.abc.Set接口中的所有操作,您可以通过这些操作的通常的C等价物来访问这些操作(比如PyObject_RichComparePySequence_Contains,尽管它们不是序列)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40005285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档