1

重複の可能性:
Python の「is」演算子が整数で予期しない動作をする
なぜ (0-6) が -6 = False なのですか?

>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True

同じ操作で、あるケースでは False になり、別のケースでは True になる方法を誰か説明してもらえますか...

もう少し奇妙な...

>>> (0 - 10) is (0 - 10)
False
4

5 に答える 5

3

等価性テストには使用しないでください。これisは同一性演算子であり、2 つの等しいオブジェクトが必ずしも同一であるとは限りません (つまり、コンピューターのメモリ内の同じアドレスに存在します)。一部の小さな整数はキャッシュされて再利用される可能性がありますが、すべてではないため、ここで異なる結果が表示されます。

さらに、この動作は実装に依存するため、これが常に当てはまるとは限りません。

于 2012-07-17T07:03:40.783 に答える
2

ドキュメントから:

現在の実装では、-5 から 256 までのすべての整数に対して整数オブジェクトの配列が保持されます。その範囲で int を作成すると、実際には既存のオブジェクトへの参照が返されます。したがって、1 の値を変更できるはずです。この場合の Python の動作は未定義であると思われます。:-)

そして、私の経験から: 私の Python2.7 では、との間を(0 + x) is x返します。Truex-5+256False

于 2012-07-17T07:06:37.277 に答える
1

のインスタンスを作成intし、それらがすべて同じオブジェクトであることを期待しています。これは通常、他のほとんどのオブジェクトではまったく機能しないため、まったく機能しないことに驚かれることでしょうTrue

この理由は、Python が起動時に頻繁に使用される整数オブジェクトの束を作成し、呼び出されたときにいつでも再利用できるためです。int不変であるため、これは問題なく機能しますが、単なる最適化です。

于 2012-07-17T07:08:11.190 に答える
1

オペレーターは、is2 つのオブジェクトが同じ ID を持っているかどうか (低レベルの用語では、それらの表現がメモリ内の同じアドレスにあるかどうか) を判断します。

a = object()
a is a
True

Python では、数値は他のオブジェクトと同様にオブジェクトであるため、is作成方法によって機能するかどうかが異なります。

a = 0
a is a
True

コードが機能する場合と機能しない場合があるのは、Python が小さな整数をインターンするためです。つまり、新しい数値オブジェクトを作成するのではなく、-5小さな整数のキャッシュを保持し、適切な数値オブジェクトを提供します。一方、あなたの場合-10はインターンされていないため、Python は毎回新しい数値オブジェクトを作成する必要があります。

インターンされるその他のオブジェクトには、短い文字列 (1 文字の文字列を含む)、Trueおよび `False.

インターンシップに頼るべきではありません。代わりに、演算子isを使用する必要があります。==

于 2012-07-17T07:08:36.727 に答える
0

同じ番号のオブジェクトを再利用する可能性のある実装の最適化がおそらくいくつかあります。

そういうわけであなたはTrue時々得ていると思います。

$ python3
Python 3.2.3 (default, May  3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> id(3)
9357472
>>> id(3)
9357472

あなたが同等性チェックを探していると私が思うもの==

>>> 3 is 3    # Result may depend on implementation details
True
>>> 3 == 3    # Always True
True
于 2012-07-17T07:12:29.930 に答える