261

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

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

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

4

6 に答える 6

318

概要:

isオブジェクトの同一性を確認する場合に使用します(例: が であるかどうかを確認するvar) None等しい==かどうかを確認したい場合に使用します(例: Is equal to ?)。var3

説明:

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
于 2013-01-09T22:08:04.063 に答える
159

isNone通常、任意のオブジェクトをシングルトンなどと比較する場合は、より高速で予測可能であるため、好まれます。is常にオブジェクト ID で比較しますが、何==が行われるかは、オペランドの正確な型とその順序によって異なります。

この推奨事項はPEP 8でサポートされており、「 None のようなシングルトンとの比較は常にorで行うべきであり、等値演算子では決して行わないでください」と明示的に述べられています。isis not

于 2013-01-09T22:10:46.273 に答える
13

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

于 2013-01-09T22:11:07.670 に答える