python 3 的 range 内存恒定约48字节,仅存 start/stop/step;xrange 功能弱、无溢出校验、不支持切片与高效 in 判断,本质是可靠性与设计差异而非单纯省内存。

range 对象本身不占多少内存,和范围大小无关;xrange 虽也惰性,但功能弱、边界检查缺失、算法更原始——省在哪、怎么省、为什么容易误判,得看这三处。
range对象内存恒定约48字节,xrange不是“不够省”,而是“没做校验”
Python 3 的 range(10**15) 和 range(10) 在 sys.getsizeof() 下几乎都是 ~48 字节。它只存 start、stop、step 三个整数加少量元信息,不存任何实际数字。
Python 2 的 xrange(10**15) 确实也不展开数据,但它的内部实现没为大整数做溢出防护:比如 xrange(2**63) 可能静默截断或崩溃,而 Python 3 的 range(2**63) 会明确抛 OverflowError。这不是“更省内存”,而是设计更严谨。
- 实测可用:
sys.getsizeof(range(10**6))和sys.getsizeof(range(10**15))结果基本一致 -
xrange在极端值下行为不可靠,不是省不省的问题,是能不能用的问题 - 真正爆内存的从来不是
range或xrange,而是你写list(range(n))
999 in range(1000) 是 O(1),xrange 是 O(n) 线性扫描
Python 3 的 range.__contains__ 把成员判断转成纯算术:检查 (n - start) % step == 0 且 n 落在有效区间内,全程不生成中间值。
Python 2 的 xrange 没实现 __contains__,表达式 999 in xrange(1000) 实际触发从头开始的逐个比对,最坏要迭代 1000 次。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
10**12 in range(10**12 + 1)在 Python 3 中瞬时返回True - 等效写法在 Python 2 中要么卡死,要么根本不敢试
- 如果你依赖
in做坐标过滤、ID 区间校验,这点差异直接影响响应时间
range[5:15:2] 返回新 range,xrange 根本不支持切片
Python 3 的 range 切片不是拷贝、不是列表,而是用数学推导新参数构造另一个恒定内存的 range 对象。例如:
r = range(0, 100, 2) # 0, 2, 4, ..., 98 s = r[5:15:2] # 等价于 range(10, 30, 4),仍只占 ~48 字节
Python 2 的 xrange(10)[2:5] 直接抛 TypeError;range(10)[2:5] 虽能运行,但返回的是列表切片,已失去惰性优势。
-
range(5)[::-1]在 Python 3 返回range(4, -1, -1),仍是轻量对象 - 有人误以为它像列表一样“反转后变大”,其实没变——但若接着调
list(),就掉进内存陷阱 - 这种切片能力让
range可用于分块调度、步长重映射等场景,xrange只能靠手动算起止值
别把 range 当成生成器,也别把它当成 list
Python 3 的 range 不是生成器,也不是迭代器,而是一个不可变序列类型(class 'range'),支持 len()、索引、切片、in,所有操作都是 O(1)。
它可哈希,能作字典键或集合成员;而 Python 2 的 xrange 是迭代器,不能哈希,也不能直接用于集合运算。
-
type(range(10))→<class></class>,不是list,也不是generator - 跨版本迁移时,
isinstance(x, collections.Iterator)在 Python 2 返回True,Python 3 返回False - 真正容易被忽略的点是:
range的内存优势只作用于range对象本身;一旦你调用list(range(n)),就立刻退化成 Python 2 的range()行为——O(n) 内存爆炸
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










