【Python】なぜ、「== None」ではなく「is None」なのか

Python

キーワードは、「同一性と同値性」「シングルトン(Singleton)」です!

None = Python版null ですが、 コーディング規約のデファクトスタンダードになっているPEP8サマは、 「Noneとの比較には is を使うべきで、絶対に等値演算子を使ってはならない」としています。 なぜなんでしょうか。 https://twitter.com/codeTaniii/status/1546678516472635393

同一性と同値性

簡単にいうと、

「同一性」は、出所が同じ/同じ実体を参照している つまるところ、同じインスタンスということです。  

「同値性」は、論理的/数学的に等しい

その場での判断なので、出自は関係ありません。

シングルトン(Singleton)

シングルトンは、1つのクラスに対して、1つのインスタンスのみを生成する設計のこと

Noneのようなシングルトンと比較する場合は...

そもそも、Noneはシングルトンなので、1つのインスタンスしか存在しえないということです。 Noneとされたものはすべて同じインスタンスなので、「xxx is None」で評価可能になります。 「同一性」で評価できるなら、「同一性」で評価したいところです。 なぜならば、「同値性」の評価は、人為的な定義しだいで変化の余地が多分にあるからです。 たとえば、False == None とか、0 == None が、どのような動作をするか、不安定になります。

Noneを「同一性」で評価すれば、こんな心配とは無縁です。 https://twitter.com/codeTaniii/status/1546757907961638913


// 追記: 2023/04/07

追記: Readability だけじゃない...!!

春休みでちょっと時間ができたので、更新。 単に Readability の問題だけでなく、これ(=同一性) を使うとかなり綺麗(かは賛否がありますが)に動的型付け言語らしく書けるようになる場面が存在します。 例えば、↓のコードでは、「同一性」判定を使うことで、関数の返り値が1つで済んでいます。

  // ここまで


ps.

ひとこと感想 今回は、「シングルトン」について調べたのが急流となって、全体がよく分かりました~

コメント