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

Python 3中range()的内存分配机制及循环执行原理问询

Python 3中range()的内存机制与for循环工作原理

一、range()的本质:轻量化的可迭代对象

先纠正一个常见误解:Python 3的range()不会生成迭代器,而是返回一个range类型对象——它属于可迭代对象,但本身不是迭代器。

从内存角度看,这个对象的设计非常高效:它仅存储三个核心参数:start(默认0)、stop、step(默认1),不管你定义的范围是range(6)还是range(100000000),它占用的内存空间几乎完全固定。

用sys.getsizeof()可以直观验证:

import sys
print(sys.getsizeof(range(6)))       # 输出约48字节(取决于Python版本和平台)
print(sys.getsizeof(range(1000000))) # 输出与上面几乎一致

对比之下,Python 2的range()或Python 3中list(range(1000000))的内存占用会随元素数量线性增长——这和你熟悉的C语言数组内存模型类似,需要存储每一个元素的引用或值。

二、for循环遍历range对象的底层逻辑

Python的for循环基于迭代器协议工作,针对for n in range(6)的执行流程如下:

  1. 自动调用iter(range(6)),将range对象转换为一个迭代器实例。
  2. 循环启动后,Python持续调用该迭代器的__next__()方法:每次调用时,迭代器会根据range对象存储的三个参数,计算出当前循环需要的下一个值(比如第一次返回0,第二次1,直到5)。
  3. 当计算出的下一个值超出stop限制时,迭代器抛出StopIteration异常,Python捕获该异常并终止循环。

这个逻辑和你熟悉的C语言for(int i=0; i<6; i++)本质一致:都是每次循环实时计算当前值,而非提前将所有值预存在内存中。Python只是用迭代器协议把这个过程封装得更通用,能适配所有可迭代对象(列表、字典、range等)。

补充:关于“生成迭代器”的说法

这是一种简化表述——range对象本身不是迭代器,但它可以通过iter()转换为迭代器,且for循环会自动完成这个转换。和yield定义的生成器不同,range对象可重复使用:你可以多次对同一个range对象调用iter(),每次都会得到一个新的迭代器,从头开始遍历。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:42:32