[Python] なぜ(0-6)は-6 = Falseですか?



Answers

Pythonは、インタプリタの-5〜256の範囲の整数を格納します。整数には、これらの整数が返される整数オブジェクトのプールがあります。 そのため、これらのオブジェクトは同じです: (0-5)-5ただし、 (0-6)-6ません。

CPythonのソースコードのソースは次のとおりです。

#define NSMALLPOSINTS           257
#define NSMALLNEGINTS           5
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];

CPythonのソースコードを見る/trunk/Objects/intobject.c )。 ソースコードには次のコメントが含まれています:

/* References to small integers are saved in this array so that they
   can be shared.
   The integers that are saved are those in the range
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/

is演算子は、同じオブジェクト(同じメモリ位置)ですが、2つの他の新しい整数( -6 )が異なるメモリ位置にあり( True返さないため)、等しいものとして( -5 ) 。 上のソースコードの257は正の整数のため、 0 - 256 (両端を含む)であることに注意してください。

http://www.laurentluce.com/posts/python-integer-objects-implementation/

Question

可能な重複:
Python "is"演算子は整数で予期せず動作する

今日私は私のプロジェクトをデバッグしようとし、分析の数時間後に私はこれを持っていた:

>>> (0-6) is -6
False

しかし、

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

なぜ私に説明することができますか? たぶんこれはある種のバグや非常に奇妙な動作です。

> Python 2.7.3 (default, Apr 24 2012, 00:00:54) [GCC 4.7.0 20120414 (prerelease)] on linux2
>>> type(0-6) 
<type 'int'>
>>> type(-6) 
<type 'int'>
>>> type((0-6) is -6)
<type 'bool'>
>>> 



CPythonはいくつかの小さな整数と小さな文字列をキャッシュし、そのオブジェクトのすべてのインスタンスに同じid()を与えるために起こっています。

(0-5)-5id()に対して同じ値を持ちますが、 0-6-6

>>> id((0-6))
12064324
>>> id((-6))
12064276
>>> id((0-5))
10022392
>>> id((-5))
10022392

文字列についても同様です。

>>> x = 'abc'
>>> y = 'abc'
>>> x is y
True
>>> x = 'a little big string'
>>> y = 'a little big string'
>>> x is y
False

文字列キャッシングの詳細については、: 演算子は文字列と空白を比較するときの動作が異なります




Links