Pythonでの文字列比較:isと==の比較
書いていたPythonスクリプトの動作がおかしいことに気づき、無限ループにたどり着きました。ループ条件は「while line is not ''」でした。デバッガで実行してみると、その行は実際には
''であることがわかりました。これを
is not ''ではなく、
!=''`に変更したところ、正常に動作しました。
また、一般的にintやBooleanの値を比較する場合でも、デフォルトでは '=='を使った方が良いとされているのでしょうか?私はいつも 'is'を使いたいと思っています。なぜなら、その方が美的にもpythonicだと思うからです(それがこの罠に陥った理由ですが...)。
519
3
必ずしもそうとは限りません。 NaNは反例です。 しかし、通常、同一性(
is
)は同等性(==
)を意味します。 逆は真ではありません。2つの異なるオブジェクトが同じ値を持つことがあります。また、一般的には、int型やBoo型の比較でも、デフォルトで '=='を使用した方が良いとされています。 また、一般的には、int型やBoolean型の値を比較するときでも
値を比較するときは===を使い、同一性を比較するときは
is
を使います。int(または不変型全般)を比較するときは、ほとんどの場合、前者を使用します。 小さな整数を
is
で比較できるような最適化がありますが、それに頼ってはいけません。真偽値の場合は、比較を一切すべきではありません。 その代わりに
を書きます。
None
との比較では、
== Noneよりも
is None`の方が好ましい。私はいつも 'is'を使いたいと思っています。
はい、それはまさにそのためのものです。
不変型に
is
と==
がどのように関わっているか、ちょっとした例を示したいと思います。試してみてください。is
はメモリ上の2つのオブジェクトを比較し、
==`はその値を比較します。例えば、小さな整数はPythonによってキャッシュされていることがわかります。値を比較するときは
==
を使い、同一性を比較するときはis
を使うべきです。(また、英語的には、"equals"と"is"は異なります)。この質問]1をご覧ください。
あなたの論理の読み方
Pythonの全ての組み込みオブジェクト(文字列、リスト、ディクショナリー、関数、など)は
は若干の欠陥があります。
is
が適用されれば、
==はTrueになりますが、逆には適用されません。is
がFalseになるのに、==
がTrueになることがあります。