73
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonにおける`is`と`==`の違い

73
Last updated at Posted at 2024-10-18

Pythonでは、is==のどちらも比較演算子として使用されますが、比較している対象が異なります。

  • is:オブジェクトの同一性(Identity)を比較する
  • ==:オブジェクトの値の等価性(Equality)を比較する

この違いを理解することで、意図しないバグを防ぐことができます。

is==の違い

比較演算子 説明 使用例
is 2つの変数が同じオブジェクトを参照しているかを比較する x is y
== 2つのオブジェクトの値が等しいかを比較する x == y

is の詳細

isは、2つの変数が同一のオブジェクトを参照しているかどうかを確認します。

a = [1, 2, 3]
b = a  # bはaと同じオブジェクトを参照

print(a is b)  # True
print(a == b)  # True

この例では、abは同じリストオブジェクトを参照しているため、is==Trueになります。

主な用途は次のとおりです。

  • Noneとの比較
  • TrueFalseなどのシングルトンオブジェクトとの比較
  • オブジェクトの同一性を確認したい場合

== の詳細

==は、オブジェクトの値が等しいかどうかを比較します。

a = [1, 2, 3]
b = [1, 2, 3]

print(a is b)  # False
print(a == b)  # True

この例では、abは別々のリストオブジェクトですが、内容は同じであるため==Trueになります。

is を使う際の注意点

Noneの比較にはisを使う

PEP 8でも、Noneとの比較にはisまたはis notの使用が推奨されています。

x = None

if x is None:
    print("xはNoneです")

値の比較にはisを使わない

整数や文字列などのイミュータブルオブジェクトでは、Pythonの最適化によって同じオブジェクトが再利用される場合があります。

そのため、値の比較にisを使うと、環境や実装によって結果が変わる可能性があります。

a = 1000
b = 1000

print(a == b)  # True
print(a is b)  # 実行環境によって異なる可能性がある

また、小さな整数はPython内部でキャッシュされるため、isTrueになることがあります。

a = 10
b = 10

print(a is b)  # Trueになることが多い

ただし、この挙動に依存したコードを書くべきではありません。

まとめ

  • isはオブジェクトの同一性を比較する
  • ==はオブジェクトの値を比較する
  • Noneとの比較にはisを使用する
  • 値の比較には基本的に==を使用する
  • 整数や文字列に対してisを使用すると、実装依存の挙動により予期しない結果になる可能性がある

迷った場合は、値の比較なら==、オブジェクトの同一性を確認したい場合のみisを使う、と覚えておくとよいでしょう。

73
46
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
73
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?