3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

is や not などは値の計算には使わない

Last updated at Posted at 2024-06-02

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の等価と等値 )
3
0
2

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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?