4

重複の可能性:
Python の「is」演算子が整数に対して予期しない動作をする

通常type(x) == type(y)、型が同じかどうかを比較するために を使用します。そしてx==y、数値が等しいかどうかを比較するために使用します。

しかし、 とがまったく同じ値を持つ同じタイプの数値を含んでいるかz1 is z2どうかを比較するために使用できるという提案がありました。多くの場合、成功します (特に正の int の場合)。z1z2

ただし、同じ数値 (ほとんどの場合は負の整数) が複数の異なるインスタンスを持つ場合があります。これは python の予期される動作ですか?

例えば:

>>> for x in range(-20,125):
    z1=x
    z2=int(float(x))
    if z1 is not z2:
        print "z1({z1}; type = {typez1}; id={idz1}) is not z2({z2}; type = {typez2}; id={idz2})".format(z1=z1,typez1=type(z1),idz1=id(z1),z2=z2,typez2=type(z2),idz2=id(z2))


z1(-20; type = <type 'int'>; id=33869592) is not z2(-20; type = <type 'int'>; id=33870384)
z1(-19; type = <type 'int'>; id=33870480) is not z2(-19; type = <type 'int'>; id=33870408)
z1(-18; type = <type 'int'>; id=32981032) is not z2(-18; type = <type 'int'>; id=33870384)
z1(-17; type = <type 'int'>; id=33871368) is not z2(-17; type = <type 'int'>; id=33870408)
z1(-16; type = <type 'int'>; id=33869712) is not z2(-16; type = <type 'int'>; id=33870384)
z1(-15; type = <type 'int'>; id=33869736) is not z2(-15; type = <type 'int'>; id=33870408)
z1(-14; type = <type 'int'>; id=33869856) is not z2(-14; type = <type 'int'>; id=33870384)
z1(-13; type = <type 'int'>; id=33869280) is not z2(-13; type = <type 'int'>; id=33870408)
z1(-12; type = <type 'int'>; id=33868464) is not z2(-12; type = <type 'int'>; id=33870384)
z1(-11; type = <type 'int'>; id=33868488) is not z2(-11; type = <type 'int'>; id=33870408)
z1(-10; type = <type 'int'>; id=33869616) is not z2(-10; type = <type 'int'>; id=33870384)
z1(-9; type = <type 'int'>; id=33871344) is not z2(-9; type = <type 'int'>; id=33870408)
z1(-8; type = <type 'int'>; id=33869064) is not z2(-8; type = <type 'int'>; id=33870384)
z1(-7; type = <type 'int'>; id=33870336) is not z2(-7; type = <type 'int'>; id=33870408)
z1(-6; type = <type 'int'>; id=33870360) is not z2(-6; type = <type 'int'>; id=33870384)
>>> x
124
>>> print x
124
>>> import sys
>>> print sys.version
2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1]
4

4 に答える 4

6

はい。0 に近い少数の数値 (ご存じのように、負よりも正の数の方が多い) のみがコンパイラによってインターンされます。式はこの範囲外の数値になる可能性があるため、等しいかどうかを確認するために使用しないisでください。

于 2012-07-23T18:42:14.870 に答える
1

Pythonのドキュメントによると:

オブジェクト IDの演算子isとテスト: は、とが同じオブジェクトである場合にのみ真になります。逆の真理値が得られます。is notx is yxyx is not y

したがって、x と y が同じ型で等しい場合でも、is関係を満たさない場合があります。

于 2012-07-23T18:46:47.580 に答える
0

の唯一の適切な使用法はis、オブジェクトの同一性が等しいかどうかを比較することです。値の等価性を比較するには、 を使用します==

于 2012-07-23T18:45:27.197 に答える
0

「is」キーワードは、値ではなく、2 つのオブジェクトの ID (基本的にはそれらが格納されているメモリの場所) を比較します。等しいかどうかのチェックには使用しないでください。

インタープリターの実装の詳細により、「is」キーワードが数回成功しました-簡単にアクセスできるように、コンパイラーによっていくつかの数値が保存されます。この動作を期待したり、依存したりしないでください。

于 2012-07-23T18:46:13.597 に答える