書いていた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つのオブジェクトを見つけたいときに
はい、それはまさにそのためのものです。
不変型に 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"は異なります)。