まえがき
Pythonを学び始めたばかりの方にとって、==、is、!=、is notという演算子は混乱の元になることがあります。
これらの演算子は似ているようでいて、実際には異なる比較を行います。
この記事では、これらの演算子の違いと、それぞれがどのような場合に使用されるのかを初心者にも分かりやすく解説します。
== と is の使い分け
== 演算子: 値の等価性の比較
== 演算子は、「等しい」という意味の比較演算子です。この演算子は、二つの値が等しいかどうかを比較し、等しい場合に True を返します。数値、文字列、リストなど、あらゆるタイプの値の比較に使用できます。
使用例:
| |
is 演算子: オブジェクトの同一性のテスト
is 演算子は、二つのオブジェクトが同一のオブジェクトである場合に True を返します。つまり、二つのオブジェクトがメモリ上で同じ場所を指しているかどうかを判断します。
使用例:
| |
== と is の比較表
| 比較基準 | == | is |
|---|---|---|
| 比較対象 | 値の等価性 | オブジェクトの同一性(メモリ位置) |
| 使用目的 | 値が等しいかどうかを確認する | 同じオブジェクトかどうかを確認する |
| 例 | [1, 2] == [1, 2] → True | [1, 2] is [1, 2] → False |
== は内容の比較、is はオブジェクトの比較に用いると覚えるとわかりやすいです。
!= と is の使い分け
!= 演算子: 値の不等価性の比較
!= 演算子は、二つの値が等しくない場合に True を返します。これは値の比較に使用され、数値、文字列、リストなど、値そのものが等しいかどうかを判断します。
使用例:
| |
is not 演算子: オブジェクトの非同一性のテスト
is not 演算子は、二つのオブジェクトが同一のオブジェクトでない場合に True を返します。つまり、二つのオブジェクトが異なるメモリ位置に存在するかどうかを判断します。
使用例:
| |
!= と is not の比較表
| 比較基準 | != | is not |
|---|---|---|
| 比較対象 | 値の不等価性 | オブジェクトの非同一性(メモリ位置の違い) |
| 使用目的 | 値が等しくないかどうかを確認する | 同じオブジェクトでないかどうかを確認する |
| 例 | 5 != 3 → True | [1, 2] is not [1, 2] → True |
実用的な使用例
改めてPythonのisとis not演算子は、オブジェクトの同一性をテストする際に使用されます。
これらの演算子は、二つのオブジェクトがメモリ上で同じ場所(つまり、同じオブジェクト)を指しているかどうかを確認します。
以下に、isとis notを使用する実用的な例をいくつか紹介しますので、慣れていきましょう。
例1: Noneのチェック
is演算子は、変数がNoneかどうかをチェックするのによく使用されます。NoneはPythonで「何もない」状態を表す特別な値です。
| |
この例では、resultがNoneかどうかをチェックしています。isを使用することで、resultがNoneを指しているかどうかを正確に判断できます。
例2: シングルトンオブジェクトの同一性テスト
Pythonでは、True、False、Noneなどのシングルトン値の同一性をテストする際にisを使用します。
これらのオブジェクトはプログラム実行中に唯一のインスタンスを持ちます。
特に関数の戻り値をチェックする際にisを使用する例を見てみましょう。
| |
この例では、ユーザーIDが負の値の場合にNoneを返し、これをis演算子でチェックしています。Noneはシングルトンであるため、isを使用するのが適切です。
例3: リストの同一性のテスト
isとis notは、二つのリストが同じオブジェクトを指しているかどうかをテストするのに使用できます。
| |
この例では、list1とlist2が同じオブジェクトを指しているため、list1 is list2はTrueを返します。
一方、list1とlist3は内容は同じですが異なるオブジェクトであるため、list1 is list3はFalseを返します。
例4: シングルトンと通常インスタンスの同一性テスト
| |
この例では、Singletonクラスからsingleton_obj1とsingleton_obj2を、RegularClassからregular_obj1とregular_obj2を生成しています。singleton_obj1とsingleton_obj2は同じクラスのシングルトンオブジェクトで生成されているため、is演算子を使用して比較すると、“singleton_obj1 と singleton_obj2 は同じインスタンスです。“という結果が得られます。
一方でregular_obj1とregular_obj2も同じクラスから生成されていますがシングルトンオブジェクトではないため、is not演算子を使用して比較すると、“regular_obj1 と regular_obj2 は異なるインスタンスです。“という結果が得られます。
SyntaxWarning: “is not” with a literal. Did you mean “!="?の警告について
Pythonで"is not"をリテラルと一緒に使用すると、SyntaxWarningが発生することがあります。
これは、Python 3.8以降で導入された警告で、リテラル値(数値、文字列、ブール値など直接記述された値)との比較にis notを使うべきではないことを示しています。
この警告は、is notがオブジェクトの同一性をテストするために使われるべきであり、値の等価性を比較する際には!=を使用すべきだというPythonのガイドラインに基づいています。
警告が出るコード例
| |
上記の例では、x is not 5という比較が行われています。
これはxが5と同一のオブジェクトでないかをテストしていますが、リテラル値である5との比較にis notを使用することは適切ではありません。
このような場合、PythonはSyntaxWarningを発生させ、!=を使用することを推奨します。
正しいコード例
| |
この修正された例では、!=演算子を使用してxが5と等しくないかをテストしています。これは値の等価性を比較するための正しい方法です。
まとめ
==と!=は値の等価性または不等価性を比較します。isとis notはオブジェクトの同一性または非同一性をテストします。
これらの違いを理解することで、Pythonでの条件分岐や値の比較をより正確に行うことができます。
正しい演算子を選択することは、プログラムの意図した動作を保証し、バグを防ぐために重要です。