私が書いていたPythonスクリプトがリス的に動作していることに気づき、それを無限ループにトレースしました。ループ条件はwhile line is not ''
でした。それをデバッガで実行すると、その行は実際には''
であることがわかりました。 !=''
ではなくis not ''
に変更しても、うまくいきました。
また、intやブール値を比較する場合でも、通常はデフォルトで '=='を使用する方が一般的に良いと考えられますか。私はそれがもっと審美的に心地良いとPythonic(これは私がこの罠に陥った方法です...)を見つけるので私がいつも 'is'を使うのが好きでした、しかし同じIDを持つオブジェクト。
すべての組み込み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を持つオブジェクト。
はい、まさにそれが目的です。
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」とは異なります。)
論理に欠陥はありません。ステートメント
もしxがyならx == yもまた真
決して を意味するように読んではいけない
x == yの場合、xはy
論理ステートメントの逆が真実であると仮定することは、読者の側には論理的な誤りです。 http://en.wikipedia.org/wiki/Converse_(logic) を参照してください。
参照してください この質問
読書におけるあなたの論理
すべての組み込みPythonオブジェクト(文字列、リスト、辞書、関数など)では、xがyの場合、x == yもTrueになります。
少し欠陥があります。
is
が適用される場合、==
はTrueになりますが、逆には適用されません。 ==
はTrueになることがありますが、is
はFalseになります。