1. ホーム
  2. python

[解決済み] 論理的同一性 == True vs is True

2023-02-05 13:16:33

疑問点

標準的な慣習として if foo is None ではなく if foo == None を使用することで、ある値が具体的に None .

ある値が正確かどうかを判断したい場合 True (単に真に近い値ではなく)であるかどうかを判断したい場合、 何か理由があるのでしょうか? if foo == True ではなく if foo is True ? これは、CPython (2.x and 3.x), Jython, PyPy などの実装によって異なるのでしょうか?

例: 例えば True がシングルトン値として使われ、その値を 'bar' や他の真に近い値と区別したい場合に使用されます。

if foo is True: # vs foo == True
    ...
elif foo == 'bar':
    ...

を使用するケースはあるのでしょうか? if foo is True とは異なる結果になるのでしょうか? if foo == True ?

注意:私が意識しているのは Python boolean - if x:, vs if x == True, vs if x is True . しかし、それは if foo , if foo == True または if foo is True は、一般に foo が真に近い値を持つかどうかを判断するために使われます。


UPDATE: によると PEP 285 § 仕様による。

FalseとTrueの値は、Noneと同様にシングルトンとなります。

どのように解決するのですか?

<ブロッククオート

ある値が正確に True であるかどうか (True に似た値であるかどうか) を判断したい場合、if foo is True ではなく if foo == True を使用する理由はありますか?

もしあなたが foo が本当にブーリアンであり、値が True 演算子を使います。

それ以外の場合、もし型が is がそれ自身の foo と比較したときに真に近い値を返します。 __eq__() と比較した場合、予期せぬ結果になってしまうかもしれません。

経験則から言うと、常に True という組み込み定数で is , TrueFalse .

CPython (2.x and 3.x), Jython, PyPy などの実装によって異なるのでしょうか?

理論的には None よりも速いでしょう。 is というのは、後者は型のカスタム == の実装を尊重する必要があり、一方 __eq__ はオブジェクトのID(例えば、メモリアドレス)を直接比較することができます。

様々なPythonの実装のソースコードを心得ているわけではありませんが、マジックメソッドの存在に対して何らかの内部フラグを使うことでその最適化ができるものがほとんどだと思いますので、実際には速度差は感じないのではないでしょうか?