🥺
Python で数値を比較するときは is を使ってはいけない
事の発端
筆者は Python の is
と ==
の使い分けをよく理解していなかったので、 AtCoder の問題を解くときに以下のようなコードを書きました
S = input()
T = input()
a = len(S)
b = len(T)
if a is b:
print("Yes")
else:
print("Ok")
これは a
や b
が小さいときには想定通りに動作します。
しかし a
や b
が大きい場合は想定通りに動作しないため、誤答となってしまいました。
is
と ==
の違い
is
はオブジェクトが同一であるかを比較するのに対し、 ==
はオブジェクトの値が等しいかを調べます。
Python では id
関数を用いることでオブジェクトを識別できる ID を調べることができます。 is
はこのオブジェクト ID が同じ値かどうかを比較します。
print(id(1)) # 4378749232
以下のコードでは a
と b
が指している数値 12345
は同じ値ですが、オブジェクト ID が異なるため a is b
は False
となってしまいます
a = 12345
b = 12345
print(id(a), id(b)) # 4380775824 4380775664
print(a is b) # False
ただし、 a
と b
が -5
から 256
の範囲の整数の場合は[1]、実装上の都合によってオブジェクト ID が同一になるため a is b
は True
になります
a = 3
b = 3
print(id(a), id(b)) # 4378749296 4378749296
print(a is b) # True
is
の使い所
ある変数が None
かどうか調べたいときは is
を使いましょう。 None
はただ一つしか存在しないオブジェクトで、 オブジェクト ID は常に一定です。
a = 3
if a is None:
print("a is None")
結論
- Python で数値比較をするときは常に
==
を使う - Python ムズカシイ
参考リンク
- https://stackoverflow.com/questions/2239737/is-it-better-to-use-is-or-for-number-comparison-in-python
- https://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is
- https://docs.python.org/ja/3/reference/datamodel.html
Discussion