Pythonでの文字列比較:isと==の比較

書いていたPythonスクリプトの動作がおかしいことに気づき、無限ループにたどり着きました。ループ条件は「while line is not ''」でした。デバッガで実行してみると、その行は実際には''であることがわかりました。これをis not ''ではなく、!=''`に変更したところ、正常に動作しました。

また、一般的にintやBooleanの値を比較する場合でも、デフォルトでは '=='を使った方が良いとされているのでしょうか?私はいつも 'is'を使いたいと思っています。なぜなら、その方が美的にもpythonicだと思うからです(それがこの罠に陥った理由ですが...)。

ソリューション

すべての組み込みPythonオブジェクト(例えば 文字列、リスト、ディクショナリー、関数。 など)について、xがyであれば、x==yも 真です。

必ずしもそうとは限りません。 NaNは反例です。 しかし、通常、同一性(is)は同等性(==)を意味します。 逆は真ではありません。2つの異なるオブジェクトが同じ値を持つことがあります。

また、一般的には、int型やBoo型の比較でも、デフォルトで '=='を使用した方が良いとされています。 また、一般的には、int型やBoolean型の値を比較するときでも

値を比較するときは===を使い、同一性を比較するときはisを使います。

int(または不変型全般)を比較するときは、ほとんどの場合、前者を使用します。 小さな整数を is で比較できるような最適化がありますが、それに頼ってはいけません。

真偽値の場合は、比較を一切すべきではありません。 その代わりに

if x == True:
    # do something

を書きます。

if x:
    # do something

Noneとの比較では、== Noneよりもis None`の方が好ましい。

私はいつも 'is'を使いたいと思っています。

より美的に好ましいと思うから の方が美的感覚に優れているからです。 この罠にはまってしまいました...)でも、この'は 意図したものなのでしょうか? 同じidを持つ2つのオブジェクトを見つけたい 同じidを持つ2つのオブジェクトを見つけたいときに

はい、それはまさにそのためのものです。

解説 (18)

不変型に 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 を使うべきです。(また、英語的には、"equals"と"is"は異なります)。

解説 (4)

この質問]1をご覧ください。

あなたの論理の読み方

Pythonの全ての組み込みオブジェクト(文字列、リスト、ディクショナリー、関数、など)は

文字列、リスト、ディクショナリー、関数。 xがyならば、x==yもまた 真です。

は若干の欠陥があります。

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

解説 (2)