Python is と == の違い


はじめに

投稿した記事のコメントで is と == の違い について教えていただきましたので、それについてまとめたいと思います。
(ミュータブル/イミュータブルとかの値のややこしい話とかは抜きにしてまとめてみました。)

1.== で比較しているもの

今まで vba や C を書く機会が多く、比較するときには==を使う習慣が身についてしまっていたわけですが、、、
pythonにおいて==で比較しているのは変数の値そのものだそうです。

ですので、次のような場合はTrueとなります。

code.py
a=[1,2]
b=[1,2]
print(a==b)
Result
True

2.is で比較しているもの

Pythonに限らずオブジェクト指向のプログラミング言語には、オブジェクト、クラス、インスタンスといった概念があります。ざっくりいうと、オブジェクトは枠、クラスは設計書、インスタンスはモノといったイメージになると思います。
(オブジェクト=焼き菓子、クラス=クッキーの作り方、インスタンス=クッキー(完成品)的な関係)

インスタンスとかややこしいことを言っていますが、 a = 10 とか何気なく変数に値を代入するだけでもインスタンスが作られています。

Pythonでは、isは、インスタンス同士のidが同じか否かを判断します。
idはid(変数)で調べることが出来ます。

code.py
a="cookies" #"cookies"のidをaに格納
b="cookies" #"cookies"のidをbに格納
A=["cookies"] #動的にメモリを確保し、確保したメモリに"cookies"を格納 → idは動的に確保した場所を示す
B=["cookies"] #動的にメモリを確保し、確保したメモリに"cookies"を格納 → idは動的に確保した場所を示す

print(id(a),id(b))
print(a is b) #idの比較
print(a==b) #値の比較
print(id(A),id(B))
print(A is B)
print(A==B)
Result
2737112766312 2737112766312 #ここの二つの値が同じ
True
True
2737112556296 2737111787336 #ここの二つの値が異なる
False
True

まとめ

is と == の二つの目線で変数を比較出来ることを学びました。
is は変数の id を比較し、 == は 変数の値そのもの を比較するようです。

C言語とかのポインタとかアドレスとかの話を、オブジェクト指向プログラミングで話すと今回の内容のような話になりそうですね。すごくややこしい反面、こうゆうところを気にしてコーディングできると綺麗なコードがかけるんだろうな~とか思いました!