「is None」と「== None」の違いは何ですか


324

私は最近この構文に出くわしましたが、違いを知りません。

違いを教えて頂ければ幸いです。



1
これはあなたの質問に答えますか?「==」と「is」に違いはありますか?
6月

この質問がisvs ==に関するものなのか、正確にNoneは何の性質なのか、どちらのコンテキストで動作がどのように異なるのかについては不明です(後者が私がここで終了した理由です)。あいまいさとOP応答の欠如に基づいて...これには非常に多くの賛成票があることに驚いています。つまり... cmon ...質問は実際の質問にも書かれていません...
RTbecard

回答:


291

答えはここで説明されています

引用するには:

クラスは任意の方法で比較を自由に実装でき、Noneとの比較を行うことを選択できます(実際には意味があります。Noneオブジェクトを最初から実装するように誰かに指示された場合、他にどのようにしてTrueと比較することができますか?それ自体に対して?)

実際には、カスタム比較演算子はまれであるため、それほど大きな違いはありません。ただしis None、原則として使用する必要があります。


57
また、:) is Noneよりも少し高速です(〜50%)== None
Nas Banov

26
@ myusuf3:>>> timeit.Timer( 'None is None')。timeit()| 0.225 | >>> timeit.Timer( 'なし==なし').timeit()| 0.328
ナズBanov

9
@ myusuf3本当にその証拠は必要ありません。isは基本的に整数比較ですが、==は参照を解決するだけでなく、型が一致しない可能性のある値を比較します。
Pijusn 2013

4
「ある」を支持する者。変数がNoneであるか、Noneと比較しても意味のないものである場合。たとえば、変数はnumpy.arrayまたはNone(私の特定のケース)にすることができます。
Jblasco 2014年

3
@TimLudwinskiの発言に追加したいと思います。最初に、誰かが等号演算子をオーバーライドしてNoneを特別なケースにすることを選択した場合、なぜそれ以外の場合はそれを伝えたいのですか?第二に、「それを行うには、明白な方法が1つ、できれば1つだけあるべきです。」そして、何かが何かと等しいかどうかを確認する明白な方法は、まあ、等価演算子です。
Yuval

162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

56

この場合、それらは同じです。Noneシングルトンオブジェクトです(存在するのは1つだけですNone)。

is オブジェクトが同じオブジェクトかどうかを確認しますが、==はそれらが同等かどうかを確認します。

例えば:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

ただし、は1つしかないNoneため、常に同じであり、isTrueを返します。

p = None
q = None
p is q # True because they are both pointing to the same "None"

17
下記のベンHoffsteinの答えで説明したように、この答えは、正しくないstackoverflow.com/questions/3257919/is-none-vs-none/...x == Noneは、独自のカスタム等価演算子を持つクラスのインスタンスでなくてTrueも評価されます。xNone
最大

5

numpyを使用する場合、

if np.zeros(3)==None: pass

numpyが要素ごとに比較するとエラーが発生します


3

Noneと比較する対象によって異なります。一部のクラスには、とは== None異なる方法で処理するカスタム比較メソッドがありis Noneます。

特にの出力はa == None ブール値である必要さえありません!! -バグの頻繁な原因。

特定の例として、==要素ごとに比較が実装されているnumpy配列を取り上げます。

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.