Python♪コンピューターの変数の記憶には、参照先のアドレスが利用される。

 コンピューターの中で、Pythonの変数はどの様に記憶されているのでしょうか。Pythonでは、そんなことを意識しなくても使えますが、関数での引数の受け渡しや、「参照渡し」「浅いコピー」「深いコピー」等を理解するには、ちょっと、勉強をした方がすっきりすると思います。

1.変数への数値の代入

 さて、簡単なコードですが、変数aに円周率3.141593を代入しました。このとき、コンピューターの中でa=3.141593は、どのように記憶されているのでしょうか。

a = 3.141593

 単純に考えると以下の様なイメージではないでしょうか。コンピューターのメモリーに変数aという場所を用意し、その中に3.141593という数字を保存するイメージです。しかし、実際にはこの様に記憶されていません。

 記憶される変数の数が少なければ、上のような方法でもよいでしょう。しかし、変数の数が多くなると、この方法では効率が悪いのです。
 例えば、小さな引き出しの消しゴムを探すのであれば、直接探すことができるかもしれません。しかし膨大な量の荷物が保管された倉庫で消しゴムを探し出すのは大変です。この様な場合には、どの棚に何が入っているかを記録したデータベースがあれば、簡単に探し出すことができます。

 コンピューターの記憶場所には、一つ一つの場所に番号がつけられており、それを参照先ののアドレスといいます。
 下図では、データの保存場所のアドレスを記録した「参照先のアドレス帳」と、「数値を実際に保存する領域」に領域を分けています。実際にはこの様に明確に分かれていないかもしれませんが、ここでは考えやすいように分けてみました。
 この例では、アドレス帳には変数aの記録場所(0001番地)が示されており、データの保存領域の0001番地に、3.141593が記録されています。
 コンピューターの中では変数はこの様に記録されています。

 それでは、変数を追加してみます。bの値6.397056は0033番地に保管されました。新しいデータは、前のデータの直後に記録されるとは限りません。例えば既にその場所に他のデータが記録されていると、そのデータを避けるようにコンピューターが自動的に最適な場所に記録します。以下の例では、変数aの参照先アドレスの直後ではなくて、少し離れた場所に変数bの参照先アドレスを記録しています。

a = 3.141593
b = 6.397056

2.変数へのリストの代入

 次はリスト[3, 7]を変数cに代入しました。数値型の場合と違い、この例では2段階で要素の中身にたどり着くようになっています。まず、cの参照先のアドレス(id)は0121番地となっており、そこにはc[0]の内容が保存されている1109番地と、c[1]の内容が保存されている1141番地が示されています。そして、1109番地には3、1141番地には7が保存されています。

a = 3.141593
b = 6.397056
c = [3, 7]

いかがでしょうか。この記事は以下の記事を読む前の準備として作成したものですので、よかったら、こちらも読んでみてください。

関連記事:
変更可能体と変更不能体はidに注目。「参照渡し」や「浅いコピー」「深いコピー」の理解にも役立ちます。