TL;DR
-
is
や、is not
はオブジェクトの同一性を判定するための演算子(Identity operator, 同一性演算子) - 同一性演算子は数値計算には使わないほうがよい
事例
とあるPythonコード
a = 255
b = 1
a + b is a + b
True
b = 2
a + b is a + b
False
ポイント
- 数は違うがどちらも同じ値を比較している
-
is
を使用している - なぜか2回目の比較ではFalseになる
なぜなのか
-
is
や、is not
は同一性演算子(Identity operator)とよばれ、値ではなく更に厳密にオブジェクトが同じかを判定する - 数を足したり引いたりしたものを比較する際にも、Pythonでは新たにオブジェクトが作成される
- Pythonでは、すべてのリテラル(数値や文字列)に対してオブジェクトが作成される
- ただし1回目の比較では、Pythonが用意したオブジェクトプールの値が使用されているため結果がTrueとなる
オブジェクトプールとは
- 頻繁に使われる値を持つオブジェクトを、再利用する思想
- Pythonが用意したオブジェクトプールとは
- メモリにもともと用意されているオブジェクト ( intは-5から256 )
公式doc:
オブジェクトプールを踏まえた挙動
1回目の比較
- 256以下のオブジェクトを比較しているためプールのオブジェクトが使用されている、同じオブジェクトを比較しているため True
2回目の比較
- 新たにオブジェクトが作成され、別々のオブジェクトが比較されているため False
また新たに定義したオブジェクトを自動的にプーリングしてくれるインターンという仕組みもあります
参考記事:
公式doc:
結論
- こういった事柄もあるため、
is
や、is not
などは値の計算に使わず、== や != を使って計算する - オブジェクト指向プログラミングではオブジェクトを比較するのか、値を比較しているのかを意識する( 等値と等価なんて言われる: Javaの等価と等値 )