memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Pythonのリストは要素は自動追加されない理由はなんだろうか?

JavascriptRubyでは以下は何の問題もなく動作します。しかし、Pythonはエラーになります。

a = []
a[10] = 0

要はリストaは空リストなので、0番目はおろか、10番目の要素にもアクセスはできません。

JavascriptRubyでは、サイズ以上の場所にアクセスすると、自動的にその間に要素が自動的に補充されます。

まぁ、仕様であり言語設計になるんでしょうけど、なんかスクリプト言語らしくない動作です。C言語みたい。たぶん、それが狙いなんでしょう。

ググってもいい答えが見つからず、いつものようにChatGPTさんに聞いてみました。

Python言語のリストのインデックスと代入に関する設計は、明示性の原則と不必要なメモリ割り当てを避けることに基づいています。

リストの特定のインデックスにアクセスしたり値を代入する際、Pythonはその位置に既存の要素があると想定します。インデックスが現在のリストの範囲内にある場合、代入は直接的に行われます。

しかし、リストの現在の長さを超えるインデックス(例:a[100] = 0)に値を代入しようとする場合、Pythonはリストを自動的に拡張して中間のインデックスをデフォルトの値で埋めることはありません。この動作は意図的なもので、いくつかの目的を果たしています:

明示性:Pythonは明示的なコードを重視し、プログラマの意図を想定しないようにします。この状況ではIndexErrorを発生させることで、リスト内に存在しないインデックスにアクセスまたは値を代入しようとしていることを認識できるようにします。これにより、潜在的なエラーを検出し、リストの長さとインデックスの明示的な処理を促します。

不必要なメモリ割り当ての回避:中間のインデックスをデフォルトの値で自動的に埋めることは、メモリを多く使用し、効率的ではありません。Pythonのアプローチでは、リストのサイズと内容を明示的に制御できるため、前提を立てずに不必要なメモリを割り当てる可能性がありません。

もしリストを拡張し、中間のインデックスをデフォルトの値で埋める必要がある場合は、先ほどの回答で示したように、明示的にリストを適切な要素数で初期化するか、appendメソッドを使用して要素を逐次的に追加することができます。これにより、リストのサイズと内容を特定のニーズに基づいて制御できます。

裏は取ってません。まぁ、そんあところだろうな。。。という感じです。気になるのがとにかくスクリプト言語っぽくない。RubyJavascriptを使いたいときって柔軟性を求めるわけで自由に書きたいとき、手早く書きたいときに使うんです。自分の場合は。だから、そこが固くなるってどうも理解できないし正直嫌いな部分であったりします。

バッテリー搭載だから使わなければならない(教えなければならない)言語になってしまいましたが。。。僕は嫌いです。3年後、5年後、どう思っているか自分自身の変化も楽しみです。