本系列文章译自Python之父 Guido van Rossum 的系列博客“The History of Python”。这个博客系列对我们理解Python及其演变很有帮助,经Guido同意,在这里翻译推荐给大家,希望大家喜欢,也请大家多多指教!
本系列地址:http://blog.kantli.com/theme/1
1
Twitter 上有人问我为什么 Python 的索引从 0 开始,并提供了一篇关于这个问题的文章(写得很好)的链接。
我记得当时我也考虑过很多因素。Python 借鉴最多的 ABC 语言索引是从 1 开始的,而另一个对 Python 影响很大的是 C语言,索引从 0 开始。我最初接触的几门语言(Algol,Fortran,Pascal)的索引有从 1 开始的,也有其它方式的。
2
我想,当时决定索引应该从 0 开始的关键因素是切片操作。
让我们看一些实际的例子:可能用户使用切片操作最多的,是获取最前面的 n 个值,或者第 i 个之后的 n 个值(获取最前面的 n 个值其实是一种特例,即 i == 第一个索引)。
显然,最好是这两种操作都不需要使用什么奇怪的 +1 或 -1 来计算位数。
如果索引从 0 开始,并使用半开区间以及合理的默认值(如 Python 后来所设定的),这两种操作的表达式可以非常优雅:a[:n] 或 a[i:i+n],前面一个表达式等价于 a[0:n]。
3
而如果索引从 1 开始,要用表达式 a[:n] 表示最前面的 n 个值,就必须使用闭区间,或者将句法改为用第一个参数表示切片的第一个元素,第二个参数 n 表示切片长度。
同时使用半开区间和从 1 开始的索引时,表达式总是不够优雅,因为使用闭区间后,取第 i 个之后的 n 个值的表达式就是 a[i:i+n-1]。
那么,使用另一种句法好不好呢?这样我们就可以直接用表达式 a[i:n]——事实上 ABC 就是这么干的,用户可以直接写 a@i|n(参考文档)。
4
使用索引加长度的句法能不能在其它地方也保持优雅呢?老实说,关于这一点,我的记忆已经模糊了。
不过,我想,我显然被半开区间的优雅所吸引了。特别是对毗邻区间进行切片时,第一个表达式的结尾正好是第二个表达式的开头,实在是非常美妙。
比如说,如果我们以索引 i 和 j 为间隔,把一个字符串分为三个部分,表达式即为 a[:i],a[i:j],a[j:]。
这就是为什么 Python 的索引是从 0 开始的。
公众号:ReadingPython