16

さまざまな Python ガイドx is Noneで、 の代わりに使用するように言われていますx == None。何故ですか?値の比較には等価性が使用されるため、x値がであるかどうかを尋ねるのが自然に思えます。誰かがなぜ好ましい形式であるかを説明し、2 つが同じ答えを与えない例を示すことができますか? None==isis

ありがとう。

4

3 に答える 3

14

人々が使用する理由isは、使用するメリットがないから==です。に等しいオブジェクトを書くことは可能ですNoneが、それは一般的ではありません。

class A(object):
    def __eq__(self, other):
        return True

print A() == None

出力:

True

演算子も高速ですが、isこの事実は重要ではないと考えています。

于 2012-06-23T04:05:11.963 に答える
11

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つが互換性があると見なされるべきではないため、ほとんどの場合重要なポイントです。

于 2012-06-23T05:43:53.437 に答える
3

PEP 8 は次のように述べています。理由は次のとおりです。

http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html

于 2012-06-23T22:13:06.303 に答える