2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonの比較演算子isで数値を比較するときの注意点

Posted at

#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が帰ってくることもあります。
これがなぜ起こるかと言うと、TrueNoneはそれぞれ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の方が良い場合もあります。
最初に出したようなTrueNoneなど、確実にidが同一であるとわかっている場合はisを使うほうがよいです。

理由はいくつかありますが、isのほうがidを直接参照しているので高速であるということ、==はユーザーが定義したクラスなどの場合にオーバーロード(挙動の書き換え)ができてしまうため不確実である可能性があるということです。

2
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?