ある人がTwitterで、Pythonはなぜ0-firstの配列インデクシングメソッドを使うのかと尋ねてきて、そのリンクを教えてくれました。Pythonの前身の1つであるABC言語では配列のインデックス付けに1-firstを使っていたのに対し、Pythonに大きな影響を与えたC言語では0-basedを使っていたのです。 私が初期の頃に開発したプログラミング言語には1-basedを使っているものもあれば、もっと柔軟なものもありました。スライス構文は、私がこの決断をした理由のひとつだと思います。
スライス構文の使い方を見てみましょう。最も一般的な使い方は、「配列の最初のnビットをスライスする」「配列のiビット目以降のnビットをスライスする」でしょう。醜い+1や-1の補正を使う必要がなければ、コードはもっと美しくなります。
例えば、a[:n]とa[i:i+n]です。前者はa[0:n]を楕円にしたものです。
1-based indexing methodでは、a[:n]を使って最初のn個の要素をスライスする場合、スライス構文でスライス開始ビットとスライス長の2つのパラメータを使うか、閉区間を使うかの選択肢しかありません。1 ベースのインデックス法を使用する場合、半開区間スライスの構文は美観上好ましくありません。同様に、閉区間スライス構文では、i 番目の位置から n 個の要素を表現するために a[i:i+n-1] を使うことしかできません。ですから、1ベースのインデックス法を使う場合は、スライス長を使う方が適切です。a[i:n]と書くことができます。実際、ABC言語ではa@i|nという特殊な使い方をします。
しかし、index:lengthの使い方は他の状況にも適しているのでしょうか?正直なところ、あまり覚えていないのですが、当時はその美的感覚に優れた半開区間構文が好きだったような気がします。特に、2つのスライス演算が隣り合っていて、****スライス演算の終了インデックスが2つ目のスライスの開始インデックスになるような場合は、書いていてとてもきれいです。例えば、ある配列をi点、j点でスライスしたい場合、a[:i]、a[i:j]、a[j:]となります。
これが、Pythonが0ベースのインデックス作成方法を採用している理由です。