权威解释来自Guido van Rossum(Python之父)的博文:《Why Python uses 0-based indexing》
一句话总结:索引从0开始,切片用法很优雅。
翻译精华如下:
我决定在Python中使用0-based索引方式的一个原因,就是切片语法(slice notation)。
让我们来先看看切片的用法。可能最常见的用法,就是“取前n位元素”或“从第
位索引起,取后
位元素”(前一种用法,实际上是 i== 起始位的特殊用法)。如果这两种用法实现时可以不在表达式中出现难看的
或
,那将会非常的优雅。
使用0-based的索引方式、半开区间切片和缺省匹配区间的话(Python最终采用这样的方式),上面两种情形的切片语法就变得非常漂亮:a[:n]和a[i:i+n],前者是a[0:n]的缩略写法。
如果使用1-based的索引方式,那么,想让a[:n]表达“取前n个元素”的意思,你要么使用闭合区间切片语法,要么在切片语法中使用切片起始位和切片长度作为切片参数。半开区间切片语法如果和1-based的索引方式结合起来,则会变得不优雅。而使用闭合区间切片语法的话,为了从第i位索引开始取后n个元素,你就得把表达式写成a[i:i+n-1]。
……
特别是当两个切片操作位置邻接时,第一个切片操作的终点索引值是第二个切片的起点索引值时,太漂亮了,无法舍弃。例如,你想将一个字符串以i,j两个位置切成三部分,这三部分的表达式将会是a[:i],a[i:j]和a[j:]。
其它编程语言的索引?
索引从0开始的编程语言:C、C++、Python、Java、PHP、Ruby、Javascript...
索引从1开始的编程语言:ABC、Matlab、VB、易语言、大部分shell语言...
索引从其它值开始的编程语言:Pascal、Lua...
还有像表示星期、月份等序列结构的数据,各种编程语言也划分成了不同阵营。
它们出于何种考虑?
C语言:索引从0开始,可以大大提升内存寻址计算的效率,详细分析参考《[C语言数组元素下标为何从0开始](https://blog.youkuaiyun.com/bufanq/article/details/51330197)》
大部分shell语言:大多数是从1开始,来源参考[stackexchange这篇问答](https://unix.stackexchange.com/questions/252368/is-there-a-reason-why-the-first-element-of-a-zsh-array-is-indexed-by-1-instead-o)
Pascal、Lua:默认从1开始,但支持改变起始索引值,原因据说是对非专业的开发者更友好,来源参考[这篇知乎问答](https://www.zhihu.com/question/19675689/answer/19174752)
以上列举的原因是最审慎的、体面的解释,话题应该到此终结,因为“索引应该从几开始最好”这个问题的破坏性不亚于“哪种编程语言是最好的”......