昨夜何か奇妙なことに出くわした
if max_urls is 0:
max_urls = 10
max_urlsが0の場合でも、常にfalseを返します。データベースから割り当てられていました。私がしたとき
print type(max_urls)
戻るだろう
<type 'long'> 0
これは正しいように見えましたが、常にfalseを返します。
に変更した場合
if max_urls == 0:
max_urls = 10
そして最後に、0のときにtrueを返します。==とisの違いはなぜですか?
_==
_は値の比較、is
はオブジェクトID(メモリ位置)の比較です。小さな値は通常Pythonでキャッシュされるため、_max_urls is 0
_のような比較で意図した結果が得られることがよくありますが、常にこの動作は信頼できないため、同等性をチェックするときにis
の代わりに_==
_を使用します。
これを説明する簡単な例を次に示します。
_>>> a = 0
>>> (a == 0, a is 0)
(True, True)
>>> a = 1000
>>> (a == 1000, a is 1000)
(True, False)
_
is
演算子は、2つの参照が同じオブジェクトを指していることを確認します。 long(0)
がint(0)
と同じオブジェクトであるかどうかをテストしており、答えは「いいえ」です。オブジェクトIDを印刷すると、これは非常に明確になります。
>>> max_urls = long(0)
>>> id(max_urls)
335952
>>> id(0)
8402324
一方、==
は、まったく同じオブジェクトでなくても、2つの値が同等であることを確認します。例えば:
>>> a = 777
>>> b = 777
>>> a is b
False
>>> a == b
True
>>> id(a)
8404568
>>> id(b)
8404640
注:1や2のような小さい数ではなく、777を使用することが重要です。 Pythonマニュアル からの引用:
現在の実装では、-5〜256のすべての整数の整数オブジェクトの配列が保持されます。その範囲で整数を作成すると、実際には既存のオブジェクトへの参照が返されます。