因为python的对象占用的内存空间比较大,创建开销也大,对于int类型有个内部的缓存机制,所以a=1和b=1实际上是指向了同一个对象,详情可以参见python源码(后附)。 另外要注意,题主这种写法python解释器是分别解析执行每一句的。如果写成"a = 999; b = 999; a is b"或者分成多行放在一个源码文件执行,就可以看到输出还是True。使用compiler.parse("a = 999\nb = 999\a is b")可以看出ast里有两个Const(999), 应该是在解释执行的时候做了相应的优化。 Python2.6.8/Objects/intobject.c #define NSMALLPOSINTS 257 #define NSMALLNEGINTS 5 ... static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; ... PyObject *PyInt_FromLong(long ival) { register PyIntObject *v; #if NSMALLNEGINTS + NSMALLPOSINTS > 0 //解释:如果 -5 <= ival && ival < 257 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { v = small_ints[ival + NSMALLNEGINTS]; Py_INCREF(v); #ifdef COUNT_ALLOCS if (ival >= 0) quick_int_allocs++; else quick_neg_int_allocs++; #endif return (PyObject *) v; } #endif if (free_list == NULL) { if ((free_list = fill_free_list()) == NULL) return NULL; } /* Inline PyObject_New */ v = free_list; free_list = (PyIntObject *)Py_TYPE(v); PyObject_INIT(v, &PyInt_Type); v->ob_ival = ival; return (PyObject *) v; } |
|