web-dev-qa-db-ja.com

Python比較なし:「is」または==を使用する必要がありますか?

Python 2.xを使用しています。

エディターはmy_var == Noneを比較すると警告しますが、my_var is Noneを使用すると警告は表示されません。

Pythonシェルでテストを行い、両方とも有効な構文であると判断しましたが、私のエディターはmy_var is Noneが推奨されていると言っているようです。

これは事実ですか?もしそうなら、なぜですか?

164
Clay Wardell

概要:

オブジェクトのidentity(たとえば、isvarであるかどうかを確認する)をチェックする場合は、Noneを使用します。 equalityを確認する場合は==を使用します(例:var3と等しいですか?)。

説明:

my_var == NoneTrueを返すカスタムクラスを持つことができます

例えば:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

isはオブジェクトをチェックしますidentity。オブジェクトはNoneが1つしかないため、my_var is Noneを実行すると、それらが実際に同じオブジェクトであるかどうかを確認しています(同等オブジェクトだけではありません)

言い換えると、==は同等性のチェック(オブジェクト間で定義されます)に対して、isはオブジェクトの同一性をチェックします。

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects
214
mgilson

isは、任意のオブジェクトをNoneのようなシングルトンと比較する場合に、より高速で予測しやすいため、一般的に推奨されます。 isは常にオブジェクトIDで比較しますが、==が行うことは、オペランドの正確なタイプとその順序に依存します。

この推奨事項は PEP 8 でサポートされています。これは 明示的に 「Noneのようなシングルトンとの比較は、常にisまたはis notで行われ、等値演算子ではありません」

102
user4815162342

PEP 8では、シングルトンを比較するときにis演算子を使用する方が良いと定義されています。

9
Thorsten Kranz