最近有人问我为什么使用基于 0 的数组索引(以下简称 0-based)并让我读一篇关于这个主题的文章(很有趣)。 这给我勾起了很多回忆。 始祖之一的ABC语言采用的是从1开始的索引方法(以下简称1为基础),而另一种影响力巨大的语言C语言则采用的是从0开始的索引方法。 我最初学的几种语言(Algol、、)中有些是基于 1 的,有些是不固定的。 我认为我决定使用从零开始的索引的原因之一是切片语法。
我们先来看看如何使用切片。 也许最常见的用法是“从数组中切出前n位”或“从值的第i位中切出n位”(前者实际上是i==起始位的特殊用法)。 使用这种语法将非常优雅,而不必用丑陋的+1或-1补码来表达它。
使用从0开始的索引,半开区间切片和默认匹配区间切片的语法变得非常漂亮:a[:n]和a[i:i+n],前者的标准写法是a[0:n ]。
如果是1基索引方式,那么如果你想让a[:n]表示为“取前n个元素”(这是不可能的),你要么使用闭区间切片语法,要么使用它切片语法中两个参数的形式:切片起始位和切片长度。 使用基于 1 的索引,半开区间切片语法变得不优雅。 这样就使用了闭区间切片语法。 为了表示从第i个位置取出n个元素,必须写成a[i:i+n-1]。 看来如果使用从1开始的索引的话,使用切片起始位+长度的形式比较合适。 这样就可以写出a[i:n]。 事实上,ABC 语言就是这样做的——它使用了一种独特的表达方式,写作 a@i|n。 (看。
但是,这个 index: 方法在其他情况下是否有效? 说实话,我对此不太记得了,但我想我对半开区间语法的优雅着迷。 尤其是当两个切片操作相邻且第一个切片操作的结束索引值是第二个切片的起始索引值时,实在是太漂亮了,舍不得丢弃。 例如,您想在两个点 i 和 j 处将数组分成三部分 - 这三个部分将是 a[:i]、a[i:j] 和 a[j:]。
这就是为什么我想使用基于 0 的索引。
【英文原文:为什么使用从0开始】