Python

Pythonの == None と is Noneの違い

Pythonでのnull判定ではis Noneを使います。
== None でも判定はできますがis Noneの方が良いとされています。

理由は== が同値性のチェックであり、
is が同一性のチェックであるためです。

詳しくは「PyQ」の公式ブログをご覧ください。

つまりどういうことだってばよ?

上記公式ブログの一番下に具体例がありますが、まだPythonの勉強を始めて間もないため、
そもそも具体例のコードがよくわかりませんでした。

以下引用となります。

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

この__eq__の部分ですね。ここを理解していないと結果の部分が理解できない気がします笑

__eq__を定義することで == の結果を制御できる!

この__eq__を定義することで、どういう比較の場合にTrueを返して欲しいかの制御が行えます。
==__eq__ と同義と考えてよいと思います。
要するに上記のFoo()クラスはどんな値と比較してもTrueが返ってくるというコードだったわけです。
上記の例をちょっと書き換えて見てみましょう。

class Foo:
     def __eq__(self, other): 
        return other == 'a'

name = Foo()
print(name == 'a')
print(name == 'b')
print(name == None)

----------------------
True
False
False

こんな感じで__eq__のみ定義したFooクラスは、文字列 'a'と比較したときだけTrueを返すようにできるわけですね。ちなみに is はこういうことができないです。

つまり、== の挙動っていうのはユーザー側でどうとでもできるので、厳密なnullチェックをやりたいなら is None を使おうねってことですね。

演算子のオーバーライドに関してはYohei Munesadaさんのブログも参考になると思うので、
載せておきます。便利ですが使い過ぎに要注意ですね笑

javaでも.equalsメソッドをオーバーライドすることで比較の制御ができますね。(やったことないですけど)
Pythonでいまいち今回の内容が頭に入ってこなかったのは、
javaだと同一性の比較が==であり、同値性の比較が.equalsだからかもしれません笑

-Python
-