23. 为什么Python索引从0开始?

Python索引

原文by Guido van Rossum 2013-10-24 翻译by kant

Twitter 上有人问我为什么 Python 的索引从 0 开始,并提供了一篇关于这个问题的文章(写得很好)的链接

我记得当时我也考虑过很多因素。Python 借鉴最多的 ABC 语言索引是从 1 开始的,而另一个对 Python 影响很大的是 C语言,索引从 0 开始。我最初接触的几门语言(Algol,Fortran,Pascal)的索引有从 1 开始的,也有其它方式的。


我想,当时决定索引应该从 0 开始的关键因素是切片操作。

让我们看一些实际的例子。可能用户使用切片操作最多的,是获取最前面的 n 个值,或者第 i 个之后的 n 个值(获取最前面的 n 个值其实是一种特例,即 i == 第一个索引)。显然,最好是这两种操作都不需要使用什么奇怪的 +1 或 -1 来计算位数。

如果索引从 0 开始,并使用半开区间以及合理的默认值(如 Python 后来所设定的),这两种操作的表达式可以非常优雅:a[:n] 或 a[i:i+n],前面一个表达式等价于 a[0:n]。


而如果索引从 1 开始,要用表达式 a[:n] 表示最前面的 n 个值,就必须使用闭区间,或者将句法改为用第一个参数表示切片的第一个元素,第二个参数 n 表示切片长度。

同时使用半开区间和从 1 开始的索引时,表达式总是不够优雅,因为使用闭区间后,取第 i 个之后的 n 个值的表达式就是 a[i:i+n-1]。

那么,使用另一种句法好不好呢?这样我们就可以直接用表达式 a[i:n]——事实上 ABC 就是这么干的,用户可以直接写 a@i|n(参考文档)。


使用索引加长度的句法能不能在其它地方也保持优雅呢?老实说,关于这一点,我的记忆已经模糊了。

不过,我想,我显然被半开区间的优雅所吸引了。特别是对毗邻区间进行切片时,第一个表达式的结尾正好是第二个表达式的开头,实在是非常美妙。

比如说,如果我们以索引 i 和 j 为间隔,把一个字符串分为三个部分,表达式即为 a[:i],a[i:j],a[j:]。

这就是为什么 Python 的索引是从 0 开始的。"


发表评论

评论列表,共 0 条评论