web-dev-qa-db-ja.com

Pythonでの文字列比較:is vs. ==

私が書いていたPythonスクリプトがリス的に動作していることに気づき、それを無限ループにトレースしました。ループ条件はwhile line is not ''でした。それをデバッガで実行すると、その行は実際には''であることがわかりました。 !=''ではなくis not ''に変更しても、うまくいきました。

また、intやブール値を比較する場合でも、通常はデフォルトで '=='を使用する方が一般的に良いと考えられますか。私はそれがもっと審美的に心地良いとPythonic(これは私がこの罠に陥った方法です...)を見つけるので私がいつも 'is'を使うのが好きでした、しかし同じIDを持つオブジェクト。

493
Coquelicot

すべての組み込みPythonオブジェクト(文字列、リスト、辞書、関数など)では、xがyの場合、x == yもTrueになります。

常にではない。 NaNは反例です。しかし、 通常 、identity(is)は等価(==)を意味します。その逆は成り立ちません。2つの異なるオブジェクトが同じ値を持つことができます。

また、intやブール値を比較する場合でも、通常はデフォルトで '=='を使用する方が一般的に良いと考えられますか

値を比較するときは==を、アイデンティティを比較するときはisを使用します。

整数(あるいは不変型一般)を比較するとき、あなたはほとんど常に前者を望みます。小さい整数をisと比較できるようにする最適化がありますが、それに頼らないでください。

ブール値の場合は、まったく比較しないでください。の代わりに:

if x == True:
    # do something

書きます:

if x:
    # do something

Noneと比較するために、is None== Noneより優先されます。

私はそれがより審美的に楽しいとPythonic(これは私がこの罠に陥った方法です...)を見つけるので、私はいつも 'is'を使うのが好きでした、しかし同じIDを持つオブジェクト。

はい、まさにそれが目的です。

570
dan04

is==が不変の型にどのように関わっているかについての小さな例を示したいと思います。試してみてください。

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

isはメモリ内の2つのオブジェクトを比較し、==はそれらの値を比較します。たとえば、小さい整数はPythonによってキャッシュされていることがわかります。

c = 1
b = 1
>>> b is c
True

値を比較するときは==を、アイデンティティを比較するときはisを使用してください。 (また、英語の観点からは、「等しい」は「is」とは異なります。)

245
pygabriel

論理に欠陥はありません。ステートメント

もしxがyならx == yもまた真

決して を意味するように読んではいけない

x == yの場合、xはy

論理ステートメントの逆が真実であると仮定することは、読者の側には論理的な誤りです。 http://en.wikipedia.org/wiki/Converse_(logic) を参照してください。

65
xubio

参照してください この質問

読書におけるあなたの論理

すべての組み込みPythonオブジェクト(文字列、リスト、辞書、関数など)では、xがyの場合、x == yもTrueになります。

少し欠陥があります。

isが適用される場合、==はTrueになりますが、逆には適用されません。 ==はTrueになることがありますが、isはFalseになります。

25
pycruft