操作符is的1个诡异问题

请看这段程序
a = 0
b = 0
while a is b:
    a += 1
    b += 1
print id(a), a
print id(b), b

猜猜结果,呵呵结果是
13013836 257
13013812 257
原因在这里:

引用
This is really hardcoded limit in the current CPython implementation
The interpreter preallocates numbers from 0 to 256.


大家可以看下intobject.c的有关这部分的源码:
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS		257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS		5
#endif
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
/* 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).
*/
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
#endif
#ifdef COUNT_ALLOCS
int quick_int_allocs, quick_neg_int_allocs;
#endif

呵呵,一目了然吧.
这边给我们的教训就是判断数字相等不要用 is操作符,哈哈.

你可能感兴趣的:(C++,c,C#)