なんとなくのイメージだけで終わらせてたのをこの機会にまとめようと忘備録を書くことにしました。
#はじめに
この記事はFluent Python ――Pythonicな思考とコーディング手法に基づいて書いています。
#同一性
まずは辞書的な意味から
1 異なる事物が、その性質から見ると区別できないこと。
2 事物が時や場所を越えてそれ自身に同じであること。自己同一性。主体性。アイデンティティー。
今回はgoo辞書さんを使いました。
本名がLisaという人がEmmaという名前で活動していたとします。
この場合名前が一緒というだけでなく中身も一緒です。
さらにLilyという人がLisaだと詐称したとします。
この場合をプログラムで表すと
Lisa = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}
Emma = Lisa;
Lily = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}
print(id(Lisa));
print(id(Emma));
print(id(Lily));
print((Lisa) is (Emma));
print((Lisa) is (Lily));
これを表示すると
4540344832
4540344832
4540344912
True
False
このようになります。
LisaとEmmaのIDは一緒ですが、LilyのIDは違うことがわかります。
is演算子を使ってもLisaとEmmaはFalseが表示され違うことがわかります。
#等価性
同じく辞書的な意味から
1 価値や価格が同じであること。同価。
2 同値 (どうち)
ということだったので同値について調べてみると
論理学で、二つの命題p、qにおいて、一方が真であれば他方も真、一方が偽であれば他方も偽という関係が成り立つとき、pとqは同値であるという。また、「pならばq」と「qならばp」が同時に成り立つとき、pとqは同値であるという。等値。等価。同等。
とのっていました。
それでは先ほどと同じくプログラムを
Lisa = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}
Emma = Lisa;
Lily = {'name': 'Lisa', 'born': 1996, 'job': 'singer'}
print(id(Lisa));
print(id(Emma));
print(id(Lily));
print((Lisa) is (Emma));
print((Lisa) is (Lily));
print((Lisa) == (Emma));
最後の行にprint((Lisa) == (Emma));
を追加しただけなのですが…笑
これを表示すると
4431907408
4431907408
4431907488
True
False
True
このようになります。
まあ、ID違うけど中身一緒だから==演算子使うとTrueになりますって話です。
#エイリアス
辞書的な意味から
エイリアスとは、偽名、別名、通称などの意味を持つ英単語。ITの分野では、ある対象や実体を、複数の異なるシンボルや識別子で同じように参照できるする仕組みを指す。別名。
まあ、あだ名みたいなものです。
あとはEmmaはLisaのエイリアスです。
#まとめ
LisaとEmmaという2つの変数は同じオブジェクトにバインドされているエイリアスで同一性があります。
LisaとLilyにバインドされているオブジェクトは同じ値ですが同一ではありません。等価性があります。
まとまってないかもです笑
#追記
エイリアスは参照渡しのようなものだとご指摘いただきました。
しかし、pythonではできないです。
pythonで参照渡しをする際の参考にしてください。
プログラミング FAQ