Python 语言的创始人解释为什么 Python 数组的索引从0开始

oschina
 oschina
发布于 2013年11月01日
收藏 37

最近有人在Twitter是问我为什么Python使用以0为第一位的数组索引方式(以下简称0-based),并让我看一篇关于这个主题的文章(很 有趣)。这引起了我不少的回忆。ABC语言——Python的祖先之一,使用的是以1为第一为的索引方式(以下简称1-based),而C语言——另一种 对Python有影响巨大的语言,使用0-based方式。我最早学习的几种语言(Algol, Fortran, Pascal),有的是1-based的,有的是不固定的。我认为,之所以让我决定让Python使用0-based索引方式的原因之一是Python的 切片(slice)语法。

让我们来先看看切片的用法。可能最常见的用法就是“从数组中切出前n位”或“从数值这第i位起切出n位”(前一种实际上是i==起始位的特殊用法)。如果使用这种语法时不需要表达成难看的+1-1补充方式,那将是非常的优雅。

使用0-based的索引方式,Python的半开区间切片和缺省匹配区间切片语法变得非常漂亮: a[:n]a[i:i+n],前者的标准写法就是a[0:n]

如果是1-base的索引方式,那么,想让a[:n]表达成“取前n个元素”,(这是不行的),你要么使用一个闭合区间切片语法,要么在切片语法中使用切片起始位和切片长度2个参数的形式。使用1-based索引方式,半开区间切片语法变得不优雅。这种方式下使用闭合区间切片语法,为了表达从第i位取n个元素时你必须写出a[i:i+n-1]。这样看来,如果使用1-based的索引,使用切片起始位+长度的形式更合适。这样你可以写成a[i:n]。事实上ABC语言就是这样做的——它使用了一个独特的表达方式,写成a@i|n。(参看http://homepages.cwi.nl/~steven/abc/qr.html#EXPRESSIONS

但 是,index:length这种方式在其它情况下适用吗?说实话,这点我有些记不清了,但我想我是被半开区间语法的优雅迷住了。特别是当两个切片操作位 置邻接时,第一个切片操作的终点索引值是第二个切片的起点索引值时,太漂亮了,无法舍弃。例如,你想将一个数组以i,j两个点切成三部分——这三部分将会 是a[:i]a[i:j]a[j:]

这就是为什么我要让Python使用0-based的索引方式的原因。

[英文原文:why Python uses 0-based indexing ]

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Python 语言的创始人解释为什么 Python 数组的索引从0开始
加载中

最新评论(33

ZZWZZ
ZZWZZ

引用来自“WeirdBird”的评论

python 之父 的小孩 好有喜感
+1024
一碗老酸菜
一碗老酸菜
背后那小孩就叫python 么?
喵星人123
喵星人123

引用来自“宝仔love”的评论

php呢?

纯索引数组也是从零开始的
M
Martinium

引用来自“职业旅行家”的评论

引用来自“飞翔的猴子”的评论

难道别的语言不是?

对不起 还有别的语言吗?

Fortran, Matlab, Pascal, Algol, Smalltalk, and many many others. Please check out this link.

http://en.wikipedia.org/wiki/Comparison_of_programming_languages_%28array%29#Array%5Fsystem%5Fcross-reference%5Flist

baiwenl
baiwenl

引用来自“宝仔love”的评论

php呢?

0
Z23
Z23

引用来自“吴下阿吉”的评论

引用来自“晓骏”的评论

python 之父 的小孩 好有喜感

+1

+10086
hit9
hit9
为什么我只看到了那个小娃娃
hangvo
hangvo

引用来自“吴下阿吉”的评论

引用来自“晓骏”的评论

python 之父 的小孩 好有喜感

+1

+1
zbh1990
zbh1990

引用来自“木筏”的评论

引用来自“铂金小金”的评论

引用来自“chao_83”的评论

引用来自“晓骏”的评论

python 之父 的小孩 好有喜感

python之父的小孩,岂不是真人版的python?

+1

+1

+1
10000011
10000011
奶爸!
返回顶部
顶部