Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのオブジェクト比較を徹底解説:「is」と「==」演算子の違い

本記事では、Pythonにおけるオブジェクト比較の方法として、「is」演算子と等価演算子「==」の違いについて詳しく解説します。

この2つの演算子は似ているようで、実はまったく異なる役割を持っています。それぞれの動作の仕組みを正しく理解することは、バグの少ないPythonコードを書く上で非常に重要です。

「==」と「is」の基本的な違い

等価演算子(==は、渡されたオブジェクトのが等しいかどうかを判定します。つまり、2つのオブジェクトがメモリ上のどこに格納されていようと、中身の内容が同じであれば「等しい」とみなされます。

一方、is 演算子は、2つのオブジェクトが同一の参照(同じメモリ上のオブジェクト)を指しているかどうかを比較します。値が同じでも、別々のオブジェクトとして生成されている場合は False となります。

まとめると以下のようになります。

  • ==:オブジェクトの内容(値)を比較する
  • is:オブジェクトの同一性(参照先)を比較する

実際のコード例で確認しよう

それでは、具体的なコードを見ながら、この概念を確認してみましょう。

list_1 = ['t','u','t','o','r']
list_2 = ['t','u','t','o','r']
list_3 = list_1

if (list_1 == list_2):
    print("True")
else:
    print("False")

if (list_1 is list_2):
    print("True")
else:
    print("False")

if (list_1 is list_3):
    print("True")
else:
    print("False")

実行結果

True
False
True

結果の解説

このコードでは、すべての変数はローカルスコープ内で宣言されており、下図のように各変数の参照関係を確認できます。

Pythonのオブジェクト比較を徹底解説:「is」と「==」演算子の違い

結果を順番に見ていきましょう。

  1. list_1 == list_2 → True
    両者とも同じ要素を持つリストなので、値の比較では「等しい」と判定されます。
  2. list_1 is list_2 → False
    list_1list_2 は内容が同じでも、それぞれ独立した別々のリストオブジェクトです。そのため、参照の比較では「同一ではない」と判定されます。
  3. list_1 is list_3 → True
    list_3 = list_1 という代入により、list_3list_1同じオブジェクトへの参照を持っています。したがって、is 演算子による比較では「同一」と判定されます。

まとめ

本記事では、Pythonにおけるオブジェクト比較について、等価演算子(==)と参照比較演算子(is)の違いを学びました。

実務においては、None のチェックなど特別なケースを除き、一般的には値の比較に == を使うのが基本です。ただし、小さな整数や短い文字列などはPythonの内部最適化によって同一オブジェクトとして扱われることがあり、挙動が直感と異なる場合もあるため注意が必要です。両者の違いをしっかり理解しておけば、意図しないバグを防ぎ、より信頼性の高いコードを書けるようになるでしょう。

  1. Pythonでタプル同士を除算する方法

    Pythonでタプル同士の除算(要素ごとの割り算)を行いたい場合、「zip」メソッドとジェネレータ式を組み合わせるとシンプルに実現できます。zipメソッドは、複数のイテラブル(反復可能なオブジェクト)を受け取り、それらの要素を対応する位置ごとにまとめてタプルとして返す機能を持っています。一方、ジェネレータとは、イテレータを手軽に作成するための仕組みです。内部的には「__iter__()」と「__next__()」というメソッドを持つクラスが自動的に実装され、内部状態も自動的に管理されます。さらに、返せる値がなくなった時点では「StopIteration」例外を発生させることで、反復処理の終了を

  2. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実