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
だからかもしれません笑