web-dev-qa-db-ja.com

Python-long / integer値を==と比較し、

重複の可能性:
Pythonの「is」演算子は整数で予期しない動作をします

昨夜何か奇妙なことに出くわした

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の違いはなぜですか?

9
Wizzard

_==_は値の比較、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)
_
23
Andrew Clark

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のすべての整数の整数オブジェクトの配列が保持されます。その範囲で整数を作成すると、実際には既存のオブジェクトへの参照が返されます。

6
John Kugelman