#isで比較するのはやめよう
それ以上でもそれ以下でもないんですが、特に必要でないときは必ず==で比較しましょう。
私のようにPythonは比較を英文っぽく書けるからちょっとカッコイイ!!なんて考えないようにしましょう。
##isと==の違いについて
詳しく書いてあるサイトはいくらでも存在するのでここでは軽く。
isはオブジェクトのid比較、==は中に入っている値の比較を行っています。(厳密には違いますがその認識で当分は良いです)
a = [1,2,3]
b = [1,2,3]
print(a == b) #True
print(a is b) #False
このように、aとbが違うオブジェクトの場合はそれぞれが別の場所に作られているため結果が異なります。
しかし
a = True
b = True
print(a is b) #True
a = None
b = None
print(a is b) #True
このように場合によっては異なるオブジェクトを比較しているつもりでもTrue
が帰ってくることもあります。
これがなぜ起こるかと言うと、True
やNone
はそれぞれ1つしか存在しないため、全てが同じオブジェクトのidを指すように作られているからです。
##数値を比較してみる
ではここで本題です。数値に対してis演算子を適用してみましょう。
a = 1
b = 1
print(a == b) #True
print(a is b) #True
a = 1.0
b = 1.0
print(a == b) #True
print(a is b) #False
int型ではis演算子でTrue
が帰ってきました。
Pythonのリファレンスを見てみると、どうやら-5
から256
は配列で最初からidが押さえてあるみたいですね。つまり、int型において-5~256
の比較のみis
が使えるようです。
実際
a = 256
b = 256
print(a is b) #True
a = 257
b = 257
print(a is b) #False
となっています。何度も言いますがむやみにis
で比較しないようにしましょう。
##ではis演算子は使わないほうが良いのか
というとそんなことはなくて、==
よりis
の方が良い場合もあります。
最初に出したようなTrue
やNone
など、確実にidが同一であるとわかっている場合はis
を使うほうがよいです。
理由はいくつかありますが、is
のほうがidを直接参照しているので高速であるということ、==
はユーザーが定義したクラスなどの場合にオーバーロード(挙動の書き換え)ができてしまうため不確実である可能性があるということです。