var is None
in Pythonコード、is
を使用して同等性をテストすることは、None
のような非常に少数のオブジェクトでのみ機能します。以前は、 ==
is
が可能な場合でも同等性を比較し、同じIDをテストする場合にのみis
を使用します。
しかし、プログラマの大半がvar is None
以上var == None
。私の印象は間違っていますか、それとも人々がis
を好む理由はありますか?
信頼できる理由は PEP-8 がそう言うからです:
Noneなどのシングルトンとの比較は、常に
is
またはis not
を使用して行う必要があります。等価演算子は使用しないでください。
したがって、TrueまたはFalseと正確に比較する必要がある場合は、is
も使用する必要があります。覚えておいてください:このような場合、「真実性」は実際の値と比較するよりも一般的に好まれます。あれは、
if somevar:
...
以上
if somevar is True:
...
または
if somevar == True:
...
私が目にする主な利点は、アイデンティティを組み込みと比較したいという明確な欲求と、任意のオブジェクトに__eq__
を定義することによって比較を壊すことができないことを強調しています。
補足として、あなたは言った:
以前は
is
が可能である場合でも==
を使用して同等性を比較し、同じIDをテストする場合にのみis
を使用する方がよいと考えていました。
それは単に「より良い実践」ではありません。平等対アイデンティティは、これらの言語構造の違いであり、絶対にそのように使用する必要があります。
実際には、それはプログラミングスタイルではなく、is
と==
は大きく異なります。
is
演算子は、2つのアイテムが同じオブジェクトを参照しているかどうかを確認します
==
演算子は、2つのアイテムが参照するオブジェクトが同一であるかどうかをチェックします
例えば:
l = [1,2,3,4,5,6,7,8,9,1,2,3,4,]
l2 = l # make ir reference the object that l references
l3 = l[:] # copy it so reference identicle objects
l is l2 # same objects
True
l == l2 # identical objects
True
l is l3 # same objects
False
l == l3 # identical object
True
リストをスライスすると、それをコピーして、同じオブジェクトをもう1つ作成します。あなたが言う時 l2 = l
同じオブジェクトを参照する新しい変数を作成しています
出典:Learning Python第5版、Mark Lutz、パートII:タイプと操作、第6章:動的タイピングの合間pp。180-184