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を使ったほうが早い。