分享

python 两个变量赋值相同的整数与浮点数 用is判断结果不同的原因?

 win2zhang 2014-09-16

因为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;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多