Python is と ==の違い
はじめに
会社のチームの勉強会でこの話題になったので調べてみたことのメモです。
まとめ
pythonのisと==は違いがあるので注意する。
ちがい
==
オブジェクト同士が等価であるか判定する演算子。 つまり、等価=同じ値・同じ順番・同じ型のこと。
v1 = [1,2,3] v2 = [1,2,3] v3 = [2,3,1] v4 = (1,2,3) v1 == v2 # true v1 == v3 # false v1 == v4 # false
==
はオブジェクトが定義している__eq__
メソッドを見ます。
オブジェクトに定義されてない場合は、最上位の基底クラスで定義されている__eq__
を参照します。
is
同じオブジェクトであるか。等価 = objectのidが同じこと。
v1 = [1,2,3] v2 = [1,2,3] v1 == v2 # true v1 is v2 # false
比較
自ら定義したクラスなどの場合、__eq__
を定義していないと==
がobjectクラスの__eq__
メソッドをたどるため、結果is
と同じ処理になります。
なので、直接is
を使ったほうが無駄がないぶん速いです
Noneの判定
isを使う
Noneはシングルトンで常にひとつしかないオブジェクトのため、Noneが代入された時点でオブジェクトのidはNoneのものと同じになります。
ちなみにsingletonはisを使うようにpep8で決まっています。(https://www.python.org/dev/peps/pep-0008/#id51)
==
はオーバーロードできてしまうので、同一のオブジェクトとして判断するならisを使いましょう。
自分で__eq__
を定義でおきるので比較するオブジェクトがどう定義するかをいちいち把握するのは手間なのでisを使ったほうが早い。