blog

Pythonの父:なぜPythonの配列添え字は0から始まるのか?

ある人がTwitterで、なぜPythonは0-based indexingを使うのかと尋ねてきて、それに関する素晴らしい記事へのリンクを教えてくれました。Pythonの前身の1つであるABC言語では...

Dec 13, 2013 · 2 min. read
シェア

ある人が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ベースのインデックス作成方法を採用している理由です。

Read next

QCon北京2014が正式に開始された!

会議は、北京でQConされている有名なウェブサイトのケーススタディ、クラウドコンピューティングのアーキテクチャケース、推奨されるシステムエンジニアリングの実践、セキュリティのトピック、スケーラビリティ、可用性、および高性能、ビッグデータ処理とビッグデータのアプリケーションなど、15のトピックをカバーし、ほぼ百ゲストに招待される共有オンサイト。

Dec 13, 2013 · 3 min read