python 3 的 range 是不可变迭代器,不支持 +、del、索引赋值等操作,因未实现 add 且设计目标为高效生成等差序列;修改需先转 list。

Python 3 的 range 是不可变的迭代器,不是列表 —— 所有试图对它做 +、del、[i] = x 或 .append() 的操作都会报 TypeError。
为什么 range 不支持拼接(+)或相加?
因为 range 对象不实现 __add__ 方法,它只负责按需生成整数,不存储全部值,也不具备序列合并语义。常见错误如:
values = range(1, 5) + ['a', 'b']
会直接抛出:TypeError: unsupported operand type(s) for +: 'range' and 'list'。
- 正确做法是显式转成
list再拼接:list(range(1, 5)) + ['a', 'b'] - 如果只是遍历,完全没必要转 ——
range更省内存,也更快 - 注意:频繁转
list大范围(如range(10**7))会显著增加内存占用
为什么不能用 del、索引赋值或删除元素?
range 是不可变对象,它的设计目标是高效生成等差整数序列,不支持修改行为。以下写法全错:
nums = range(10)<br>del nums[3] # TypeError: 'range' object doesn't support item deletion<br>nums[0] = 99 # TypeError: 'range' object does not support item assignment
- 需要删/改/插元素?必须先转成
list:nums = list(range(10)) - 若只是随机访问某个位置(如
nums[5]),range支持 O(1) 索引读取,但不支持写入 —— 这点常被误认为“支持索引所以可改” - 旧代码从 Python 2 迁移时最容易踩这个坑,因为 Python 2 的
range返回的就是list
为什么调用 range 时报 “'range' object is not callable”?
这不是 range 本身的问题,而是你无意中把变量名命名为 range,覆盖了内置函数:
range = list(range(10)) # 覆盖了内置 range<br>x = range(5) # TypeError: 'list' object is not callable
- 检查是否在作用域内定义过叫
range的变量(包括循环变量for range in ...) - 修复只需重命名该变量,或用
del range清除遮蔽,再重启解释器更稳妥 - 这种错误不会在首次导入时暴露,往往出现在二次执行同一段脚本时
真正容易被忽略的是:很多开发者以为“能用 for i in range(...) 就等于它是个容器”,但其实它连“容器”的基本契约(可修改、可扩展、可拼接)都不满足。所有修改需求,都得靠 list(range(...)) 拉出来单独处理 —— 没有捷径,也不能省略这一步。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











