JavaScriptを有効にしてください

Pythonの演算子解説 "==" vs "is"、"!=" vs "is not"

 · 

Pythonを学び始めたばかりの方にとって、==is!=is notという演算子は混乱の元になることがあります。
これらの演算子は似ているようでいて、実際には異なる比較を行います。
この記事では、これらの演算子の違いと、それぞれがどのような場合に使用されるのかを初心者にも分かりやすく解説します。

== vs is

== 演算子: 値の等価性の比較

== 演算子は、「等しい」という意味の比較演算子です。この演算子は、二つの値が等しいかどうかを比較し、等しい場合に True を返します。数値、文字列、リストなど、あらゆるタイプの値の比較に使用できます。

使用例:

1
2
3
print(5 == 5)  # True
print("Python" == "python")  # False
print([1, 2, 3] == [1, 2, 3])  # True

is 演算子: オブジェクトの同一性のテスト

is 演算子は、二つのオブジェクトが同一のオブジェクトである場合に True を返します。つまり、二つのオブジェクトがメモリ上で同じ場所を指しているかどうかを判断します。

使用例:

1
2
3
4
5
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a is b)  # False
print(a is c)  # True

!= vs is not

!= 演算子: 値の不等価性の比較

!= 演算子は、二つの値が等しくない場合に True を返します。これは値の比較に使用され、数値、文字列、リストなど、値そのものが等しいかどうかを判断します。

使用例:

1
2
print(5 != 3)  # True
print("hello" != "hello")  # False

is not 演算子: オブジェクトの非同一性のテスト

is not 演算子は、二つのオブジェクトが同一のオブジェクトでない場合に True を返します。つまり、二つのオブジェクトが異なるメモリ位置に存在するかどうかを判断します。

使用例:

1
2
3
4
5
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a is not b)  # True
print(a is not c)  # False

実用的な使用例

改めてPythonのisis not演算子は、オブジェクトの同一性をテストする際に使用されます。
これらの演算子は、二つのオブジェクトがメモリ上で同じ場所(つまり、同じオブジェクト)を指しているかどうかを確認します。
以下に、isis notを使用する実用的な例をいくつか紹介しますので、慣れていきましょう。

例1: Noneのチェック

is演算子は、変数がNoneかどうかをチェックするのによく使用されます。NoneはPythonで「何もない」状態を表す特別な値です。

1
2
3
4
5
6
result = None

if result is None:
    print("resultには何も割り当てられていません。")
else:
    print("resultには何かが割り当てられています。")

この例では、resultNoneかどうかをチェックしています。isを使用することで、resultNoneを指しているかどうかを正確に判断できます。

例2: シングルトンオブジェクトの同一性テスト

Pythonでは、TrueFalseNoneなどのシングルトン値の同一性をテストする際にisを使用します。
これらのオブジェクトはプログラム実行中に唯一のインスタンスを持ちます。
特に関数の戻り値をチェックする際にisを使用する例を見てみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def get_user_status(user_id):
    # 仮の例: ユーザーIDに基づいてユーザーステータスを返す
    if user_id < 0:
        return None  # ユーザーが見つからない場合
    return True

user_status = get_user_status(-1)

if user_status is None:
    print("指定されたユーザーは存在しません。")
else:
    print("ユーザーステータスが正常に取得されました。")

この例では、ユーザーIDが負の値の場合にNoneを返し、これをis演算子でチェックしています。
Noneはシングルトンであるため、isを使用するのが適切です。

例3: リストの同一性のテスト

isis notは、二つのリストが同じオブジェクトを指しているかどうかをテストするのに使用できます。

1
2
3
4
5
6
list1 = [1, 2, 3]
list2 = list1
list3 = [1, 2, 3]

print(list1 is list2)  # True: list1とlist2は同じオブジェクト
print(list1 is list3)  # False: list1とlist3は内容は同じでも異なるオブジェクト

この例では、list1list2が同じオブジェクトを指しているため、list1 is list2Trueを返します。
一方、list1list3は内容は同じですが異なるオブジェクトであるため、list1 is list3Falseを返します。

例4: シングルトンと通常インスタンスの同一性テスト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            print("インスタンスが存在しないため、新しく作成します。")
            cls._instance = super(Singleton, cls).__new__(cls)
        else:
            print("既にインスタンスが存在するため、それを返します。")
        return cls._instance

class RegularClass:
    pass

# シングルトンオブジェクトの作成
singleton_obj1 = Singleton()
singleton_obj2 = Singleton()

# singleton_obj1 と singleton_obj2 が同じインスタンスであるかテスト
if singleton_obj1 is singleton_obj2:
    print("singleton_obj1 と singleton_obj2 は同じインスタンスです。")

# 通常のクラスからオブジェクトを作成
regular_obj1 = RegularClass()
regular_obj2 = RegularClass()

# regular_obj1 と regular_obj2 が異なるインスタンスであるかテスト
if regular_obj1 is not regular_obj2:
    print("regular_obj1 と regular_obj2 は異なるインスタンスです。")
else:
    print("regular_obj1 と regular_obj2 は同じインスタンスです。")

この例では、Singletonクラスからsingleton_obj1singleton_obj2を、RegularClassからregular_obj1regular_obj2を生成しています。
singleton_obj1singleton_obj2は同じクラスのシングルトンオブジェクトで生成されているため、is演算子を使用して比較すると、“singleton_obj1 と singleton_obj2 は同じインスタンスです。“という結果が得られます。

一方でregular_obj1regular_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のガイドラインに基づいています。

警告が出るコード例

1
2
3
4
x = 1
# 警告が出る例
if x is not 5:
    print("xは5ではありません。")

上記の例では、x is not 5という比較が行われています。
これはxが5と同一のオブジェクトでないかをテストしていますが、リテラル値である5との比較にis notを使用することは適切ではありません。
このような場合、PythonはSyntaxWarningを発生させ、!=を使用することを推奨します。

正しいコード例

1
2
3
4
x = 1
# 値の等価性を比較する正しい方法
if x != 5:
    print("xは5ではありません。")

この修正された例では、!=演算子を使用してxが5と等しくないかをテストしています。これは値の等価性を比較するための正しい方法です。

まとめ

  • ==!= は値の等価性または不等価性を比較します。
  • isis not はオブジェクトの同一性または非同一性をテストします。

これらの違いを理解することで、Pythonでの条件分岐や値の比較をより正確に行うことができます。
正しい演算子を選択することは、プログラムの意図した動作を保証し、バグを防ぐために重要です。


Pythonを本格的に勉強したい方は、初心者に優しく分かりやすいPyQで学ぶのが最適です。
価格もリーズナブルなのでオススメです。



スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア