You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3中dict.values()返回dict_values类型的原因是什么

为什么dict.values()返回dict_values对象,而非list、set或tuple类型

dict_values是Python 3专门设计的字典值视图对象,替换Python 2返回list的方案,核心是解决旧设计的性能和灵活性问题,设计优势非常明确:

  • 无额外内存开销:dict_values本身不存储任何实际数据,只是原字典的一个代理接口,不会像list/tuple那样调用时就把所有值拷贝一遍生成独立序列。对于十万、百万级元素的大字典,这能省掉非常可观的内存分配和数据拷贝成本。
  • 动态同步原字典状态:视图和原字典是实时绑定的,字典内容发生增删改时,不需要重新调用.values(),视图里的内容会自动同步更新,举个简单示例:
score_dict = {"math": 90, "chinese": 85}
all_scores = score_dict.values()
print(list(all_scores))  # 输出 [90, 85]

score_dict["english"] = 95  # 原字典新增键值对
print(list(all_scores))  # 输出 [90, 85, 95],视图自动同步最新内容
  • 内置集合运算支持:dict_values原生支持交集、并集、差集等集合操作,不需要额外转set就能直接做值的重合判断、差异对比,这是list、tuple类型不具备的能力。
  • 迭代效率更高:绝大多数场景下开发者调用.values()只是为了遍历值、做成员判断,根本不需要一个独立的序列副本,直接迭代dict_values省去了生成副本的全量遍历步骤,执行速度更快。

你遇到的numpy兼容问题,本质是numpy旧版本没有适配Python标准库的可迭代对象协议导致的,新版本numpy已经支持直接传入可迭代对象构造数组。哪怕需要转成list,也只需要手动套一层list()即可,这个按需转换的成本,远低于旧设计中不管用户要不要副本、每次调用都强制生成list的无意义开销。

另外两种类型也完全不适合作为返回值:

  • 不能返回set:字典的值允许重复,set会自动去重,会破坏原始值的语义
  • 不能返回tuple:tuple是静态不可变序列,生成时同样需要全量拷贝数据,既没有性能优势,也做不到动态同步原字典的状态

Python 2返回list的设计是早期版本的历史遗留,当时没有视图的概念,默认返回list的逻辑在大量场景下会产生完全不必要的内存浪费。Python 3调整为返回视图对象,本质是把「是否需要生成独立序列副本」的选择权交还给用户:需要list/set/tuple时手动转换即可,不需要时直接用零开销的视图,整体设计的灵活性和性能表现远优于Python 2的方案。

内容的提问来源于stack exchange,提问作者Zaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:54:31