本当に簡単な質問です。
次の違いは何ですか:
if a.b is 'something':
と
if a.b == 'something':
私の無知を許してください
本当に簡単な質問です。
次の違いは何ですか:
if a.b is 'something':
と
if a.b == 'something':
私の無知を許してください
1 つ目は同一性をチェックし、2 つ目は等価性をチェックします。
例:
を使用した最初の操作は、これらのアイテム、つまり文字列がメモリ内のどこに格納されているかによって結果が変わるis
場合とそうでない場合があります。True
a='this is a very long string'
b='this is a very long string'
a is b
False
チェックすると、id()はそれらが異なる場所に保存されていることを示しています。
id(a)
62751232
id(b)
62664432
文字列が等しいため、2 番目の操作 ( ==
) が得られます。True
a == b
True
または(最初の例と比較してください) であるis
可能性があることを示す別の例ですが、期待どおりに機能します。True
False
==
'3' is '3'
True
これは、上記の例の 2 つの長い文字列とは異なり、これらの短いリテラルの両方が同じメモリ位置に格納されたことを意味します。
'3' == '3'
True
ここで驚くことではありません。
id()is
を使用して、メモリ内の同じオブジェクトが参照されているかどうかを判断していると思います(詳細については、以下の @SvenMarnach コメントを参照してください)
a is b
a
とb
が同じオブジェクトの場合、 は true です。それらは同等に比較できますが、異なるオブジェクトです。たとえば、次のようになります。
>>> a = [1, 2]
>>> b = [1, 2]
>>> c = b
>>> a is b
False
>>> a is c
False
>>> b is c
True
>>> a == b == c
True