Python stores integers in the range -5 - 256 in the interpreter: it has a pool of integer objects from which these integers are returned. That's why those objects are the same: (0-5)
and -5
but not (0-6)
and -6
as these are created on the spot.
Here's the source in the source code of CPython:
#define NSMALLPOSINTS 257
#define NSMALLNEGINTS 5
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
(view CPython source code: /trunk/Objects/intobject.c
). The source code includes the following comment:
/* 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).
*/
The is
operator will then compare them (-5
) as equal because they are the same object (same memory location) but the two other new integers (-6
) will be at different memory locations (and then is
won't return True
). Note that 257
in the above source code is for the positive integers so that is 0 - 256
(inclusive).
(source)
is
in the first place? It's not something that should be often used in Python, apart from theis/is not None
case. - Russell Borogove=
, an incorrect expectation. - LarsH