を比較するとエディタから警告my_var == None
が表示されますが、 を使用すると警告が表示されませんmy_var is None
。
私は Python シェルでテストを行い、両方とも有効な構文であると判断しましたが、エディターはそれが望ましいと言っているようmy_var is None
です。
これは事実ですか? もしそうなら、それはなぜですか?
を比較するとエディタから警告my_var == None
が表示されますが、 を使用すると警告が表示されませんmy_var is None
。
私は Python シェルでテストを行い、両方とも有効な構文であると判断しましたが、エディターはそれが望ましいと言っているようmy_var is None
です。
これは事実ですか? もしそうなら、それはなぜですか?
is
オブジェクトの同一性を確認する場合に使用します(例: が であるかどうかを確認するvar
) None
。等しい==
かどうかを確認したい場合に使用します(例: Is equal to ?)。var
3
my_var == None
が返されるカスタムクラスを持つことができますTrue
例えば:
class Negator(object):
def __eq__(self,other):
return not other
thing = Negator()
print thing == None #True
print thing is None #False
is
オブジェクトIDをチェックします。object は 1 つしかないNone
ため、実行するときは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
is
None
通常、任意のオブジェクトをシングルトンなどと比較する場合は、より高速で予測可能であるため、好まれます。is
常にオブジェクト ID で比較しますが、何==
が行われるかは、オペランドの正確な型とその順序によって異なります。
この推奨事項はPEP 8でサポートされており、「 None のようなシングルトンとの比較は常にorで行うべきであり、等値演算子では決して行わないでください」と明示的に述べられています。is
is not
PEP 8 は、is
シングルトンを比較するときに演算子を使用する方が良いと定義しています。