identity ってなに?




全てのオブジェクトは identity という数字を持っています。 identity は組み込み関数 id で調べることができます。

class User:
    pass

id(User())
>>> id(User())
4454567552
>>> 

id(object)
オブジェクトの "識別値" を返します。 この値は整数で、 このオブジェクトの有効期間中は一意かつ定数であることが保証されています。 有効期間が重ならない 2 つのオブジェクトは 同じ id() 値を持つかもしれません。

ここで大事なのは変数、属性、要素には オブジェクトが保存されているのではなく identity が保存されているということです。

リンク先に簡単なスライドをまとめました。

identity は難しい

identity とはオブジェクトについている番号です。 変数や属性は、identity を保存する箱です。 これだけ見ると、そんなに難しいそうには見えません。

ただ identity の概念と関係したことを学ぼうとすると、すこし引っかかったりします。 言葉では簡単なのですが、この概念に慣れるのがすこし面倒なのです。

Python の identity は基本的には C 言語の  アドレス  です。 ほとんどの Python は C 言語で書かれています。 C 言語で作られた Python を CPython と言います。 恐らく、いま使われている Python は CPython のはずです。 他にも Java で書かれた Jython などもあったりしました。

id(object)
CPython における実装の詳細: 返り値は、メモリにおけるオブジェクトの  アドレス  です。

C 言語の学習において  アドレス  が難所とされています。 そのためアドレスの理解のためだけに一冊の本があったりします。 僕はアドレス、ポインタが嫌で C 言語から Python に逃げましたが、 こうして捕まってしまいました。 Amazon で検索すると、それだけのために4、5冊の本が出版されているのがわかります。

identity は、変数や属性という箱に入った番号というだけの話です。 しかし、それと関連したことを触れようとすると、ちょっと手間がかかります。 そこで  「代入」   「イミュータブル」   「リストの初期化」   「コピー」  を通して identity に慣れてしまおうと思いました。

「コピー」が最後に来ています。 オブジェクトをコピーするというのは、言葉の割に地味に難しいのです。 プログミラミングにおいて、コピーは2種類に分けられます。 浅いコピーと深いコピーです。

「イミュータブル」で浅いコピーについて軽く触れて、 「リストの初期化」で深いコピーについて軽く触れて、 最後に「コピー」につなげていきます。

identity に触れる 4 ステップ

identity をいろいろな角度から、実際に触っていこうというそんな 4 ステップです。













Last Updated: 8/4/2019, 2:03:18 PM