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

为什么Python中字典keys方法的返回值会被归类为生成器类工具?

关于dict.keys()被归类为生成器范畴的原因

Mark Lutz在《Learning Python》中提到的「生成器范畴」实际是广义的惰性可迭代对象,而非狭义的、由yield生成的迭代器对象,这个归类完全符合Python 3的实现逻辑,和你使用的3.7版本没有冲突。

1. dict_keys本质是惰性视图对象,并非预生成的列表

你看到的dict_keys([1, 2])只是它的调试用字符串表示,不代表它内部预先存储了所有键的副本,它的核心特性是动态关联原字典:

d = {1:1, 2:2}
keys = d.keys()
print(keys) # 输出 dict_keys([1, 2])

# 修改原字典
d[3] = 3
del d[1]
print(keys) # 输出 dict_keys([2, 3]),无需重新调用d.keys()即可获取最新的键

如果它是提前生成的列表结构,上述修改原字典的操作不会同步到之前获取的keys结果中。

2. 它和range、map的核心特性一致

三者都属于惰性计算的实现,共性是:

  • 创建时不会生成、存储所有元素,内存占用不会随元素数量增长而线性上升:哪怕是有100万个键的字典,d.keys()返回的对象内存占用也和只有2个键的字典的keys对象基本一致
  • 只有在实际迭代(for循环遍历、转list/tuple等显式操作)时才会读取对应元素

唯一的差异是:map本身是迭代器(可以直接调用next()获取下一个元素),而range、dict_keys属于可迭代对象,需要通过iter()包装后才能生成迭代器,但这并不影响它们被归到广义的惰性计算序列范畴。

3. 版本差异的说明

Python 2中d.keys()确实返回预生成的列表,Python 3开始才改成惰性的dict_keys视图对象,如果该书提及的是Python 3的特性更新,这个归类没有问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:45:04