web-dev-qa-db-ja.com

`var is None`対` var == None`

var is None in Pythonコード、isを使用して同等性をテストすることは、Noneのような非常に少数のオブジェクトでのみ機能します。以前は、 ==isが可能な場合でも同等性を比較し、同じIDをテストする場合にのみisを使用します。

しかし、プログラマの大半がvar is None以上var == None。私の印象は間違っていますか、それとも人々がisを好む理由はありますか?

8
timakro

信頼できる理由は PEP-8 がそう言うからです:

Noneなどのシングルトンとの比較は、常にisまたはis notを使用して行う必要があります。等価演算子は使用しないでください。

したがって、TrueまたはFalseと正確に比較する必要がある場合は、isも使用する必要があります。覚えておいてください:このような場合、「真実性」は実際の値と比較するよりも一般的に好まれます。あれは、

if somevar:
    ...

以上

if somevar is True:
    ...

または

if somevar == True:
    ...

私が目にする主な利点は、アイデンティティを組み込みと比較したいという明確な欲求と、任意のオブジェクトに__eq__を定義することによって比較を壊すことができないことを強調しています。


補足として、あなたは言った:

以前はisが可能である場合でも==を使用して同等性を比較し、同じIDをテストする場合にのみisを使用する方がよいと考えていました。

それは単に「より良い実践」ではありません。平等対アイデンティティは、これらの言語構造の違いであり、絶対にそのように使用する必要があります。

12
Joel Harmon

実際には、それはプログラミングスタイルではなく、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

0
Cheyn Shmuel