很多人第一次接触 Python 里的 range 时,都会有一个小疑问。比如:
range(1,8)
它实际表示的是:
1 ≤ x < 8
也就是 [1, 8)。
这时你会好奇,既然已经包含了左边的 1,为什么不顺手把右边的 8 也包含进去?做成 [1, 8] 看起来似乎更“完整”。不少人会下意识觉得,这可能只是语言设计时的一种约定,没有太多讲究。但如果稍微留意一下就会发现,不只是 Python,Java、C++、JavaScript 里的类似语法,全都是这么干的。这就奇怪了。总不能全世界的程序员都同时脑子抽了吧?
所以更合理的问题应该是:这种左闭右开的形式,到底解决了什么问题?能让所有人都不约而同地选择它?
算一个数就能让你少一个 Bug
先看最直观一点,就是区间长度的计算不用动脑。
在左闭右开的区间 [start, end) 中,长度可以直接写成:
end - start
比如:
[1, 8) → 8 - 1 = 7
这和我们实际数出来的元素个数是一致的:1,2,3,4,5,6,7,一共 7 个。
但如果你用的是闭区间的 [1, 8],算长度就得这样写:
长度 = end - start + 1
这里多出来的 +1 看起来只是一个小细节,但在实际开发中,它往往意味着额外的思考成本。尤其是在循环、统计、区间处理等场景里,这个 +1 很容易被忘掉,或者加错位置。
而这类问题有一个专门的名字:off-by-one(差一错误)。你可以理解为,你以为你数对了,但结果永远差 1。
举个简单例子:
你想用 range 循环 10 次。如果你是闭区间的思维,可能会写:
# 假设 range 是闭区间,想循环 10 次for i in range(0, 10): # 闭区间 [0,10] → 0 到 10 一共 11 次 print(i)
这样就多了一次。而左闭右开的设计,让 range(0, 10) 刚好是 0~9,一共 10 次。你写 end - start,就是元素个数。不需要任何 +1 或 -1 的修正。这个细节小到你不会注意,但大到能让你的代码少掉一大类边界错误。
分段处理时,不会多也不会少
再看一个比较稍微隐蔽但非常重要的场景:区间的拼接。
很多时候,我们需要把一段数据拆成小区间进行处理,比如分页、批处理、分片计算等。如果采用左闭右开区间,可以这样划分:
[a, b) 和 [b, c)
这两个区间拼在一起,刚好是:
[a, c)
不会重复,也不会遗漏。用代码类比一下:
part1 =list(range(0,5))# [0,5) → 0,1,2,3,4
part2 =list(range(5,10))# [5,10) → 5,6,7,8,9
combined = part1 + part2
# 正好是 0~9,没有重复也没有缺失
这样的好处就是只要相邻区间共享边界,就能无缝拼接。对比其他设计就会发现问题:
如果是闭区间 [0,5] 和 [5,10],数字 5 会重复
如果人为调整为 [0,4] 和 [5,10],又容易在边界上出错
左闭右开的关键在于:边界只属于一侧。这样区间之间就可以无缝衔接,而不需要额外处理。这种设计保证了区间之间可以稳定组合。
与索引系统保持一致(实际使用中的关键)
再回到最常见的代码场景:遍历数组。
arr =[10,20,30,40]
for i inrange(0,len(arr)):
print(arr[i])
这里其实隐藏着一个很“顺”的对应关系:
数组索引范围是:0 ~ len(arr) - 1
range(0, len(arr)) 表示的是 [0, len(arr))
也就是说,range 刚好覆盖了所有合法索引。关键点在于:
len(arr) 表示的是“边界”,而不是“最后一个元素的位置”。如果 range 是闭区间,那么写成:
range(0,len(arr))
就会访问到:
arr[len(arr)]# 越界
这在设计上是不可接受的。正因为使用了左闭右开:起点是第一个索引,终点是“边界”, 不需要额外调整。
整个逻辑保持了一致性。可以理解为,range 不是独立设计的,它是跟着数组索引的规则走的。索引怎么来,range 就怎么来。回到最开始的问题:为什么 range(1, 8) 不包含 8?不是因为设计者心情不好,也不是为了数学上的优雅。而是因为它解决了三类你每天都在面对的麻烦:
这三件事单独看都不大,但组合在一起,帮你消灭了一整类边界错误。所以你可以记住这句话:左闭右开减少的不是一个数,而是一类问题。
以上就是“Python 的 range 为什么是左闭右开的?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://phpxs.com/post/14191/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料