回答:
is
常に戻る True
同じオブジェクトインスタンスを比較する場合はます
一方==
、最終的に決定されるのは__eq__()
方法
すなわち
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
is
オペレーターをカスタマイズできない(ユーザー定義のクラスによってオーバーロードされる)ことを追加することもできます。
__eq__(self)
は==
、Pythonオブジェクトで使用した場合の処理方法を決定する特別な組み込みメソッドです。ここでは==
、タイプのオブジェクトで使用されたときFoo
に常にtrueを返すようにオーバーライドしています。is
演算子には同等のメソッドがないため、の動作をis
同じ方法で変更することはできません。
このオブジェクトのアイデンティティと同等性を読みたいと思うかもしれません。
ステートメント 'is'はオブジェクトの識別に使用され、オブジェクトが同じインスタンス(メモリ内の同じアドレス)を参照しているかどうかを確認します。
また、「==」ステートメントは等号(同じ値)を指します。
a=1;b=1;print(a is b) # True
です。a is b
2つの異なるオブジェクト(メモリ内の異なるアドレス)のように見えても、なぜ真であることがわかるのでしょうか?
注意の言葉:
if foo:
# do something
とまったく同じではありません:
if x is not None:
# do something
前者はブール値テストであり、さまざまなコンテキストでfalseと評価できます。空のコンテナー、ブール値など、ブール値のテストでfalseを表すものは多数あります。この状況でもfalseと評価されるものはありませんが、他のことも同様に評価されます。
(ob1 is ob2)
に等しい (id(ob1) == id(ob2))
is
バージョンは全く関数呼び出し、およびなしのpythonインタプリタ属性検索を必要としません。インタプリタは、ob1が実際にob2である場合、すぐに応答できます。
{} is {}
虚偽であるとid({}) == id({})
することができ(及びある真CPythonの中で)。stackoverflow.com/questions/3877230を
もちろん、同一のオブジェクトは等しいため、違いはありません。ただし、PEP 8には、次のように使用する必要があることが明記されていますis
。
Noneなどのシングルトンとの比較は、is演算子またはis演算子ではなく、決して等価演算子で行う必要があります。
is
同一性ではなく同一性をテストします。ステートメントのfoo is none
場合、Pythonはオブジェクトのメモリアドレスを単に比較します。「同じオブジェクトに2つの名前がありますか?」という質問をしているということです。
==
一方、__eq__()
メソッドによって決定された等価性をテストします。それはアイデンティティを気にしません。
In [102]: x, y, z = 2, 2, 2.0
In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)
In [104]: x is y
Out[104]: True
In [105]: x == y
Out[105]: True
In [106]: x is z
Out[106]: False
In [107]: x == z
Out[107]: True
None
シングルトン演算子です。だから、None is None
常に真です。
In [101]: None is None
Out[101]: True
Noneの場合、等価(==)とアイデンティティ(is)の間に違いがあってはなりません。NoneTypeはおそらく、等しいかどうかのIDを返します。NoneはNoneTypeで作成できる唯一のインスタンスであるため(これは本当だと思います)、2つの操作は同じです。他のタイプの場合、これは常に当てはまるわけではありません。例えば:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
リストにはデフォルトのIDの返りではない比較演算があるため、これは「等しい」を出力します。
@ ジェイソン:
に沿ってもっと何かを使用することをお勧めします
if foo: #foo isn't None else: #foo is None
fooが真にブール値(つまり0または1)を表していない限り、「if foo:」の使用は好きではありません。fooが文字列やオブジェクトなどの場合、「if foo:」は機能するかもしれませんが、私にとっては怠惰なショートカットのように見えます。xがNoneかどうかを確認している場合は、「xがNoneの場合:」と言います。
if foo
falseを返し、コメント#foo is None
は間違っています。
さらに詳細:
このis
句は、2つobject
のが同じメモリ位置にあるかどうかを実際にチェックします。つまり、両方が同じメモリ位置を指し、同じであるかどうかid
。
1の結果として、is
字句的に表現された2つobject
のが同じ属性(attributes-of-attributes ...)を持っているかどうかを確認します
以下のようなプリミティブ型のインスタンス化はbool
、int
、string
(いくつかの例外を除いて)、NoneType
同じ値を有することは、常に同じ記憶場所にあろう。
例えば
>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True
そしてNoneType
、Pythonの「ルックアップ」テーブルにはそれ自体のインスタンスを1つしか含めることができないため、前者と後者は、コードを記述した開発者のプログラミングスタイルに近いものです(一貫性を保つため)。どちらかを選択してください。
some_string is "bar"
文字列を比較するためにこれまでに使用しないでください。そうするための単一の受け入れ可能な理由はありません、そしてあなたがそれを期待しないときそれは壊れます。CPythonが同じ内容の2つの不変オブジェクトを作成するのは愚かであることを知っているため、これが頻繁に機能するという事実は単純です。しかし、それはそれでも起こり得ます。
int
ではありませんよね?
None
シングルトンであるJohn Machinの結論は、このコードによって補強された結論です。
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
以来None
シングルトンである、x == None
とx is None
同じ結果を持っているでしょう。しかし、私の審美的な意見でx == None
は、最高です。
None
オブジェクトは正確にオブジェクトであることが意図されています。比較するFalse
と、他の値が真実であることと似ていることを除いて、他のコンテキストでNoneが使用されることはほとんどありません。そのような場合、次のようなことをするのがより慣用的ですif x: pass