Pythonでは、None
の判定に==
ではなくis
を使う理由があります。それは、==
とis
がチェックするものが異なるからです。
==
とis
の違い
==
は同値性を検査します。つまり、「同じ値と見なしてよければTrueとしよう」という考え方です。しかし、==
はPythonのクラス実装でプログラマーがカスタマイズできるため、何を同値と判定するかは対象のオブジェクトによって異なります。
一方、is
は同一性を検査します。つまり、「完全に同じものだったらTrueにしよう」という考え方です。これはプログラマーがカスタマイズできないので、name is None
の結果がTrueなら、name
はNone
以外にはありえません。
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
クラスのインスタンスfoo
はNone
と==
で比較するとTrue
になりますが、is
で比較するとFalse
になります。これは、==
が同値性を検査するため、Foo
クラスで定義した__eq__
メソッドの結果が返されるからです。一方、is
は同一性を検査するため、foo
とNone
が全く同じオブジェクトでなければFalse
になります。
まとめ
Pythonでは、None
の判定にはis
を使うことが推奨されています。これは、==
とis
がチェックするものが異なるためです。==
は同値性を、is
は同一性を検査します。そのため、None
の判定にis
を使うことで、確実に値がNone
であるかどうかを判断することができます。