Python 切片索引限制为0x7FFFFFFF

Python 切片索引限制为0x7FFFFFFF,python,python-2.7,python-internals,Python,Python 2.7,Python Internals,我正在用Python(2.7.4)处理切片: 一切似乎都按预期进行: class Foo(object): #... >f=Foo() >>> >>>f[42] 42 >>> >>>f[20:30] key.start=0x14 key.stop=0x1E '10' 但切片索引似乎仅限于0x7FFFFFFF: >>f[0xFEDCBA98:0xFFFFFFFF] key.start=0x7FFFFFFF key.stop=0x7FFFFFFF '0' >>>f[0x80000000:0

我正在用Python(2.7.4)处理切片:

一切似乎都按预期进行:

class Foo(object):
   #...
>f=Foo()
>>>
>>>f[42]
42
>>>
>>>f[20:30]
key.start=0x14 key.stop=0x1E
'10'
但切片索引似乎仅限于0x7FFFFFFF:

>>f[0xFEDCBA98:0xFFFFFFFF]
key.start=0x7FFFFFFF key.stop=0x7FFFFFFF
'0'
>>>f[0x80000000:0x90000000]
key.start=0x7FFFFFFF key.stop=0x7FFFFFFF
'0'

为什么切片索引不受与常规
int
值相同的
long
整数提升的影响?有什么解决方法吗?

我意识到这似乎是旧式类的局限性。(从
对象派生的对象
)的行为符合预期:

class Foo(object):
   #...
结果:

>f=Foo()
>>>
>>>f[0x80000000:0x90000000]
key.start=0x8000000 key.stop=0x90000000
'268435456'
>>>
>>>f[0xFEDCBA98:0x1200000000]
key.start=0xFEDCBA98 key.stop=0x1200000000
'73033532776'
>>>
我在任何地方都没有看到这方面的记录。这尤其令人困惑,因为这个限制不在
切片
类本身中:

>>> s = slice(0xFEDCBA98, 0x1200000000)
>>>
>>> s
slice(4275878552L, 77309411328L, None)
>>>
>>> hex(s.start)
'0xfedcba98L'

经过多次搜索,我找到了这个

在Python3.3中,切片的开始和结束如下

但在2.7中,它们被发现为


在2.7中,
PyInt\u fromsize\u t
最终使用
long
的大小,而在3.3中,
PyLong\u fromsize\u t
使用
PyObject
的大小。这就是为什么它在3.3中运行良好,而在2.7中运行不好。

很有趣。我使用Python3.3获得了正确的结果。2@aIKid谢谢-我没有立即访问Python3的权限。这是有道理的,因为Python3只有新样式的类。。。看,很有趣!我想剩下的问题是,为什么它在2.7中使用新样式的对象(派生自
对象
)而不是旧样式?我假设不同的结果是在引擎盖下使用不同的类型,这可能是出于相同的原因。如果有机会,我可能会深入研究。谢谢你的伟大研究!
start = PyLong_FromSsize_t(istart);
...
end = PyLong_FromSsize_t(istop);
start = PyInt_FromSsize_t(istart);
...
end = PyInt_FromSsize_t(istop);