#slice処理の違和感
前記事です:PythonのSliceにモヤっとした話
殆どのプログラマはおそらく、配列からある要素を抜き出したい場合添字にIndexを指定するというのが意識に刷り込まれているのではないでしょうか。
+++++++++++++++++++++++++++++++++++++
element + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
+++++++++++++++++++++++++++++++++++++
index + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +
ある配列の7個目の要素を抜き出したい場合、以下の様なコードと結果になる事に違和感を覚えるプログラマはまずいないでしょう。
l=[1,2,3,4,5,6,7,8,9]
print(l[6])
#7
そのため、配列に対してslice操作を行う場合も、当然のようにIndexで範囲を指定しようとします。
l=[1,2,3,4,5,6,7,8,9]
print(l[6:7])
#[7]
oh… 私はIndexの6~7を指定したつもりだったので、予想した結果は
#[7,8]
なのですが、現実は非情でした。
#違和感の正体
結論から言えばsliceの処理で配列の添字とするべきは、IndexでなくLengthでした。
+++++++++++++++++++++++++++++++++++++
element + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +
+++++++++++++++++++++++++++++++++++++
length 0___1___2___3___4___5___6___7___8___9
l=[1,2,3,4,5,6,7,8,9]
print(l[6:7])
#[7]
Lengthの図表と処理を見比べ、添字がIndexではなくLengthなんだと脳内で置き換えてみると、長さ6~7の間にある要素を取得する処理となるため、出力結果にも違和感がなくなりました、ああスッキリ。
#でもなんでLength?
判りません。
range関数のようにLengthを指定してIndexの範囲を取得する処理はたしかに直感的で便利ですが、だからといってIndex基準が主流の配列の添字に対してまでLength基準での添字記法を態々混在させる程のどんな素晴らしい理由があるのか、結局判りませんでした。
#実はわかりやすい(?)Lengthを使った配列操作
上では配列の添字にLengthを使うことに対し否定的でしたが、実は誰しもLengthを添字にしようとしたことがあるはずなんです(多分)、私はあります。
あれは幼い頃、お年玉をはたいて近所のLaoxでDelphi2.0とはじめてのDelphiみたいな参考書を購入し(何故Delphiを選んだのかは判りません、多分GUIプログラミング言語の中で一番安かったとかそんな理由です)、意気揚々とプログラムの勉強を始めた時です。
参考書のサンプルを見ながらコードを組んではエラーと修正を繰り返しつつ、配列のページに差し掛かりました。
参考書「配列の最初の要素を取得するには、添字に0を指定します。」
僕「なんで?」
当時、周囲にその疑問に答えられる人は誰もおらず、渋々最初の要素を取りたいときは0、次の要素を取りたいときは1、と呪いのように意識に刷り込みました。
なので今回私が抱いた違和感も、実は全くプログラミングを知らない人ならそもそも違和感すら感じず受け入れるのかもしれません。
仮にすべての配列操作がLength基準によって行われる言語が主流になったなら、
参考書「配列の最初の要素を取得するには、添字に1を指定します。」
僕「なるほど」
こんな世界もあり得るのかもしれません。
#というわけで
結論としては、納得は行かないが理解はした、という感じです、あんまりスッキリしませんでしたね。
とはいえ、今更Length基準で配列操作を行うのが世界の主流になられても困ってしまいますし、配列の添字はこれからもできる限りIndex基準で統一して欲しい、と言う希望を述べつつ終わりとさせていただきます。