さまざまな Python ガイドx is None
で、 の代わりに使用するように言われていますx == None
。何故ですか?値の比較には等価性が使用されるため、x
値がであるかどうかを尋ねるのが自然に思えます。誰かがなぜ好ましい形式であるかを説明し、2 つが同じ答えを与えない例を示すことができますか? None
==
is
is
ありがとう。
さまざまな Python ガイドx is None
で、 の代わりに使用するように言われていますx == None
。何故ですか?値の比較には等価性が使用されるため、x
値がであるかどうかを尋ねるのが自然に思えます。誰かがなぜ好ましい形式であるかを説明し、2 つが同じ答えを与えない例を示すことができますか? None
==
is
is
ありがとう。
人々が使用する理由is
は、使用するメリットがないから==
です。に等しいオブジェクトを書くことは可能ですNone
が、それは一般的ではありません。
class A(object):
def __eq__(self, other):
return True
print A() == None
出力:
True
演算子も高速ですが、is
この事実は重要ではないと考えています。
is
キーワードはアイデンティティをテストします。のような比較演算子ではありません==
。使用is
は、2つの引数が同じ値および/または同じ内部構造を持っているかどうかをテストするだけではありません。つまり、2つが実際にメモリ内の同じオブジェクトを参照しているかどうかをテストします。これには多くの影響があります。1つはis
オーバーロードできないこと、もう1つは可変タイプと不変タイプで動作が異なることです。たとえば、次のことを考慮してください。
>>> l1 = range(5)
>>> l2 = range(5)
>>> l1 == l2
True
>>> l1 is l2
False
>>> l3 = l1
>>> l1 is l3
True
>>> s1 = "abcde"
>>> s2 = "abcde"
>>> s1 == s2
True
>>> s1 is s2
True
ここでは、リストは変更可能であるため、メモリ内の場所を共有できず、その結果is
、==
矛盾した結果が生成されます。一方、文字列は不変であるため、メモリがプールされる場合があります。基本的に、is
単純で不変の型、または複数の名前がメモリ内のまったく同じオブジェクトを指している場合(l3
上記の例での使用など)にのみ確実に使用でき、その使用は、ではなくIDをテストしたいことを示します価値。メソッドルックアップを実行しないため、is
わずかに高速になると思いますが、誤解される可能性があります。==
もちろん、リストやdictのような複雑なコンテナオブジェクトの場合、is
よりもはるかに高速である必要があります==
(おそらく、O(1)対O(n))。とは言うものの、速度の問題は、2つが互換性があると見なされるべきではないため、ほとんどの場合重要なポイントです。
PEP 8 は次のように述べています。理由は次のとおりです。
http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html