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)的执行流程如下:
- 自动调用
iter(range(6)),将range对象转换为一个迭代器实例。 - 循环启动后,Python持续调用该迭代器的
__next__()方法:每次调用时,迭代器会根据range对象存储的三个参数,计算出当前循环需要的下一个值(比如第一次返回0,第二次1,直到5)。 - 当计算出的下一个值超出
stop限制时,迭代器抛出StopIteration异常,Python捕获该异常并终止循环。
这个逻辑和你熟悉的C语言for(int i=0; i<6; i++)本质一致:都是每次循环实时计算当前值,而非提前将所有值预存在内存中。Python只是用迭代器协议把这个过程封装得更通用,能适配所有可迭代对象(列表、字典、range等)。
补充:关于“生成迭代器”的说法
这是一种简化表述——range对象本身不是迭代器,但它可以通过iter()转换为迭代器,且for循环会自动完成这个转换。和yield定义的生成器不同,range对象可重复使用:你可以多次对同一个range对象调用iter(),每次都会得到一个新的迭代器,从头开始遍历。
内容的提问来源于stack exchange,提问作者TheRealNoofle
相关产品推荐
相关产品推荐

