Python 为什么int(maxint)给出long,而int(int(maxint))给出int?这是个小虫子吗?

Python 为什么int(maxint)给出long,而int(int(maxint))给出int?这是个小虫子吗?,python,python-2.7,numpy,int,long-integer,Python,Python 2.7,Numpy,Int,Long Integer,非常不言自明(我在Windows上): 导入系统,numpy >>>a=numpy.int(sys.maxint) >>>int(a).\uu类__ >>>int(int(a))。uu类__ 为什么调用int一次会给我一个long,而调用两次会给我一个int 这是一个bug还是一个特性?正如(现已删除)其他答案中所建议的,这似乎是一个bug,因为的使用不正确。这个问题特定于Numpy和Python 2。在Python3中,没有单独的int和long类型 该行为是由于numpy中的一个off b

非常不言自明(我在Windows上):

导入系统,numpy >>>a=numpy.int(sys.maxint) >>>int(a).\uu类__ >>>int(int(a))。uu类__ 为什么调用
int
一次会给我一个
long
,而调用两次会给我一个
int


这是一个bug还是一个特性?

正如(现已删除)其他答案中所建议的,这似乎是一个bug,因为
的使用不正确。这个问题特定于Numpy和Python 2。在Python3中,没有单独的
int
long
类型

该行为是由于numpy中的一个off by one错误导致的<带有一个参数的code>int(x)
通过调用将
x
转换为数字
PyNumber\u Int
则专门采用由
numpy返回的
int64
作为。Int
Int
的子类:

m=o->ob\u type->tp\u as\u number;
如果(m&&m->nb_int){/*这应该包括int的子类*/
/*经典课程总是走这条路*/
PyObject*res=m->nb_int(o);
if(res&(!PyInt_Check(res)&&!PyLong_Check(res))){
PyErr_格式(PyExc_类型错误,
“\uuuu int\uuuu返回的非int(类型%.200s)”,
res->ob_类型->tp_名称);
Py_DECREF(res);
返回NULL;
}
返回res;
}
现在,对于这个代码,调用
a->ob\u type->tp\u as\u number->nb\u int
,它在中实现。这是为不同类型参数化的代码的位置;这是一个用于填充方法槽的
\u int
方法。如果出现以下情况,则将其关闭一个

if(LONG_MIN < x && x < LONG_MAX)
    return PyInt_FromLong(x);
int
的情况下,将
@func@
替换为longlong
中的
PyLong\u。因此,将返回
long(sys.maxint)


现在,由于
sys.maxint
仍然可以用
int
表示,
int(long(sys.maxint))
返回一个
int
;同样地,
int(sys.maxint+1)
返回一个
long

也给了我一个int,在Ubuntu 14.04 LTS上使用Python 2.7.6和numpy 1.8.2,在Ubuntu 16.04 LTS上使用Python 2.7.12 numpy 1.11.0。我提到的结果是在Linux上得到的。我刚刚用Numpy 1.12.1在Windows上进行了测试,我确实复制了您的结果。对于2147483646,它给出了一个
int
,但是对于2147483647,它是一个
long
。相关的:我在Linux上用
numpy.int64(9223372036854775807)
,它被转换成
long
,而小于这个值的1则被转换成
int
@ashwinichaudy:与这个问题没有真正的关系;请参阅我的编辑。
    if(LONG_MIN < x && x < LONG_MAX)
        return PyInt_FromLong(x);
#endif
    return @func@(x);
if(LONG_MIN < x && x < LONG_MAX)
    return PyInt_FromLong(x);
return @func@(x);