我在Python 3.6中检查了sys.maxsize
的帮助:
>>> help(sys)
[...]
maxsize -- the largest supported length of containers.
测试它:
In [10]: '{:,}'.format(sys.maxsize)
Out[10]: '9,223,372,036,854,775,807'
In [11]: math.log2(sys.maxsize)
Out[11]: 63.0
它是63位,这表明一个主要的符号位。但是,容器的长度不能为负。
这里发生了什么?
Python 2.5中容器的最大大小从231-1增加到263-1。引入变化的PEP 353: Using ssize_t as the index type,says:
为什么不size_t
实现此功能的初始尝试尝试使用size_t。很快就发现这不起作用:Python在许多地方使用负指数(表示从结尾开始计算)。即使在size_t可用的地方,在必要时也需要进行太多的代码重构,例如:在循环中像:
for(index = length-1; index >= 0; index--)
如果索引从int更改为size_t,则此循环将永不终止。
因此,限制源于决定使用特定于Python的“索引”类型,为了简化负索引的处理,可以方便地将其定义为signed(ssize_t)而不是unsigned(size_t)。