PythonではNoneの比較は==ではなくisを使う

前にPythonの勉強を軽くしたものの、短期間で基本的な部分だけをサラッとやったために時間が経ったら忘れてしまってました。



で、久々に何となく書きつつ、
「あ、pythonはeqとかなくて判断する時は==一種類でいいんだったっけ。」
とかうろ覚えのままif文書いてたので

if data == None:
    print 'OK'

みたいな文を書いてたんだけど、他の人のコード見てたら

if data is None:
    print 'OK'

ってのが出てきて、
「あー!isとかあるんだっけ!」
となり、data == Noneって書き方が間違ってるのかどうか確かめることに。



結果は間違ってるみたいですね。Noneの比較はisを使いましょうと書いてありました。



isと==じゃググっても上手くヒットしなかったんですが、何とかJared Grubb: Python: "is None" vs "==None"にたどり着き、
「英語かー。よくわかんないやぁ」
と思いながらザックリ読んだところ、おそらく
「==は__eq__が呼び出されるからTrue返すように定義するとNoneじゃないのにTrueにできちゃうよ。それにisでNoneを判別した方が==で判別するより相当速いよ」
みたいな事が書いてありました。
元々の引用の「PEP」ってのがPython Enhancement Proposalの略で、Pythonをより良くする提案のまとめみたいですね。
(__eq__については__eq__って書き方がそもそも何かわからなかったけど、リファレンス読んだ感じからすると多分そういう意味だと思う。isで呼び出される特殊メソッドはないのかな?)



あと、他にもGoogle Python スタイルガイド — PyGuide - 2.29に、

None との比較に == や != を利用してはいけません。 is や is not を利用します。

ってのがあるので、is Noneで比較しておけば間違いなさそう。
書き換えなくちゃ。