重複の可能性:
Pythonの「is」演算子が整数で予期しない動作をする
私はPythonを学んでいて、その理由に興味があります。
x = 500
x is 500
Falseを返しますが、:
y = 100
y is 100
Trueを返しますか?
重複の可能性:
Pythonの「is」演算子が整数で予期しない動作をする
私はPythonを学んでいて、その理由に興味があります。
x = 500
x is 500
Falseを返しますが、:
y = 100
y is 100
Trueを返しますか?
Pythonは小さな整数を再利用します。つまり、すべて1
のs(たとえば)は同じ1
オブジェクトです。私が正しく覚えていれば、範囲は-5から255ですが、これはCPython実装の詳細であり、信頼すべきではありません。たとえば、JythonとIronPythonはこれを異なる方法で処理すると確信しています。
これがうまく機能する理由は、int
sが不変であるためです。つまり、をインプレースに変更することはできませ4
ん5
。a
の値が4の場合、実際には別のオブジェクトをa = 5
指しており、 containsの値を変更していません。Pythonは、同じオブジェクトへの複数の参照が予期せず問題を引き起こす可能性がある可変タイプ(リストなど)を共有しません。a
a
==
ほとんどのものを比較するために使用する必要があります。is
2つの参照が同じオブジェクトを指しているかどうかを確認するためのものです。とほぼ同等id(x) == id(y)
です。
is
同一性のテスト-それらが単に「同等」であるかどうかではなく、それらが同じオブジェクトx is y
であるかどうかを尋ねます。だからあなたも持っています、例えば:
>>> x = []
>>> y = []
>>> z = x
>>> x is y
False
>>> x is z
True
同等性については、同等性をテストする必要があります。
>>> x = 500
>>> x == 500
True
Python(または、少なくともcpython-主要な実装)は、特定の不変オブジェクトがインタープリターの存続期間中に1回だけ存在するように、いくつかの最適化を行います。したがって、5
プログラム全体ですべて同じ整数オブジェクトになります。たとえば、文字列リテラルでも同じことが起こります。
「is」はオブジェクトIDを比較し、「==」はオブジェクト値を比較します。したがって、値を比較する必要がある場合は「==」を使用し、オブジェクトを比較する場合は「is」を使用します。
Pythonの場合と同様に、すべてがオブジェクトであり、オブジェクトIDを比較します。高速ですが、予測できない場合もあります。単純な比較のために「is」を使用するには、自分が何をしているのかを非常によく理解する必要があります。
上記の状況について、私はここで見つけました:http: //docs.python.org/c-api/int.html次のコメント:
現在の実装では、-5から256までのすべての整数の整数オブジェクトの配列が保持されます。その範囲でintを作成すると、実際には既存のオブジェクトへの参照が返されます。したがって、1の値を変更できるはずです。この場合のPythonの動作は未定義だと思います。:-)
したがって、次のテストを実行して、この動作を確認できます。
>>> a = 256
>>> id(a)
19707932
>>> id(256)
19707932
>>> a = 257
>>> id(a)
26286076
>>> id(257)
26286064
したがって、256を超える整数の場合、「is」は機能しません。比較には「is」を使用するように注意してください。