identity ってなに?
全てのオブジェクトは identity という数字を持っています。 identity は組み込み関数 id で調べることができます。
#
# 対話モード >>> に
# コピペで実行できます。
#
id('a')
id(3)
id([0, 1, 2])
class User:
pass
id(User())
>>> id('a')
4340507120
>>> id(3)
4338044768
>>> id([0, 1, 2])
4340538336
>>>
>>> class User:
... pass
...
>>> id(User())
4341562320
>>>
id(object) (opens new window)
オブジェクトの "識別値" を返します。 この値は整数で、 このオブジェクトの有効期間中は一意かつ定数であることが保証されています。 有効期間が重ならない 2 つのオブジェクトは 同じ id() 値を持つかもしれません。
ここで大事なことは、変数や属性、あるいはリストや辞書の要素には、 オブジェクトそのもの保存されていないということです。 では、何が保存されいるのでしょうか? identity という背番号のようなものが保存されいます。
# identity は難しい
identity とはオブジェクトが持っている背番号のようなものです。 変数や属性は、identity を保存する箱です。 これだけ見ると、そんなに難しいそうには見えません。 ただ identity の概念と関係したことを学ぼうとすると、 すこし引っかかったりします。 言葉では簡単なのですが、この概念に慣れるのがすこし面倒なのです。
Python の identity は C 言語の アドレス です。 ほとんどの Python は C 言語で書かれています。 C 言語で作られた Python を CPython と言います。 恐らく、いま使われている Python は CPython のはずです。 他にも Java で書かれた Jython などもあったりしました。
id(object) (opens new window)
CPython における実装の詳細: 返り値は、メモリにおけるオブジェクトの アドレス です。
C 言語の学習において アドレス が難所とされています。 そのためアドレスの理解のためだけに一冊の本があったりします。 Amazon で検索すると、それだけのために 4, 5 冊の本が出版されているのがわかります。
自分は、アドレスが嫌で C 言語から Python に逃げて来ました。 しかし、こうして捕まってしまいました。 逃走してから捕まるまでの期間は、そんなに長くなかった気がします笑 いまは以下のような大変素晴らしい YouTube の動画があります。
C 言語の動画ですが雰囲気はつかめるかもしれません。 C 言語の最初の難関がアドレスとポインタです。 見る必要性はないと思うのですが、 本当にめちゃくちゃいい動画なので、この動画で雰囲気だけ押さえておくことは、 悪いことではないのかなと思ったりもします。
プログラミング言語としてのCは、初学者にとっては難しい言語であるのは確かです。 中には、初心者が学ぶべき言語ではないと言い出す人もいます。 ですが、私たちセキュリティ・ネットワークコースの教員は、 我々のコースの学生は早期にCを学ぶべきであると考え、 このカリキュラムを設定しています。以下に理由を列挙します。
なぜCを学ぶべきなのか - 立命館大学情報理工学部セキュリティ・ネットワークコース プログラミング言語サポートページ (opens new window)
identity は、変数や属性という箱に入った番号というだけの話です。 しかし、それと関連したことを触れようとすると、ちょっと手間がかかります。 そこで 「代入」 、 「イミュータブル」 、 「リストの初期化」 、 「コピー」 を通して identity に慣れてしまおうと思いました。
「コピー」が最後に来ています。 オブジェクトをコピーするというのは、言葉の割に地味に難しいのです。 プログミラミングにおいて、コピーは2種類に分けられます。 浅いコピーと深いコピーです。
「イミュータブル」で浅いコピーについて軽く触れて、 「リストの初期化」で深いコピーについて軽く触れて、 最後に「コピー」につなげていきます。
# identity に触れる 4 ステップ
identity をいろいろな角度から、実際に触っていこうというそんな 4 ステップです。