Pythonを学び始めたばかりの方にとって、==
、is
、!=
、is not
という演算子は混乱の元になることがあります。
これらの演算子は似ているようでいて、実際には異なる比較を行います。
この記事では、これらの演算子の違いと、それぞれがどのような場合に使用されるのかを初心者にも分かりやすく解説します。
==
vs is
==
演算子: 値の等価性の比較
==
演算子は、「等しい」という意味の比較演算子です。この演算子は、二つの値が等しいかどうかを比較し、等しい場合に True
を返します。数値、文字列、リストなど、あらゆるタイプの値の比較に使用できます。
使用例:
|
|
is
演算子: オブジェクトの同一性のテスト
is
演算子は、二つのオブジェクトが同一のオブジェクトである場合に True
を返します。つまり、二つのオブジェクトがメモリ上で同じ場所を指しているかどうかを判断します。
使用例:
|
|
!=
vs is not
!=
演算子: 値の不等価性の比較
!=
演算子は、二つの値が等しくない場合に True
を返します。これは値の比較に使用され、数値、文字列、リストなど、値そのものが等しいかどうかを判断します。
使用例:
|
|
is not
演算子: オブジェクトの非同一性のテスト
is not
演算子は、二つのオブジェクトが同一のオブジェクトでない場合に 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での条件分岐や値の比較をより正確に行うことができます。
正しい演算子を選択することは、プログラムの意図した動作を保証し、バグを防ぐために重要です。
Pythonを本格的に勉強したい方は、初心者に優しく分かりやすいPyQで学ぶのが最適です。
価格もリーズナブルなのでオススメです。