编程学习网 > 编程语言 > Python > Python 的 range 为什么是左闭右开的?
2026
05-30

Python 的 range 为什么是左闭右开的?


很多人第一次接触 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教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取