Pythonでは、Noneの判定に==ではなくisを使う理由があります。それは、==isがチェックするものが異なるからです。

==isの違い

==同値性を検査します。つまり、「同じ値と見なしてよければTrueとしよう」という考え方です。しかし、==はPythonのクラス実装でプログラマーがカスタマイズできるため、何を同値と判定するかは対象のオブジェクトによって異なります。

一方、is同一性を検査します。つまり、「完全に同じものだったらTrueにしよう」という考え方です。これはプログラマーがカスタマイズできないので、name is Noneの結果がTrueなら、nameNone以外にはありえません。

Noneの判定

Pythonでは、Noneは特別な値であり、オブジェクトの値が存在しないことを表します。そのため、Noneの判定にはisを使うことが推奨されています。

例えば、以下のコードを見てみましょう。

class Foo:
    def __eq__(self, other):  # 同値性検査の動作をカスタマイズ
        return True

foo = Foo()

print(foo == None)  # True
print(foo is None)  # False

このコードでは、FooクラスのインスタンスfooNone==で比較するとTrueになりますが、isで比較するとFalseになります。これは、==が同値性を検査するため、Fooクラスで定義した__eq__メソッドの結果が返されるからです。一方、isは同一性を検査するため、fooNoneが全く同じオブジェクトでなければFalseになります。

まとめ

Pythonでは、Noneの判定にはisを使うことが推奨されています。これは、==isがチェックするものが異なるためです。==は同値性を、isは同一性を検査します。そのため、Noneの判定にisを使うことで、確実に値がNoneであるかどうかを判断することができます。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です