首页 > 解决方案 > 为什么容器的最大尺寸有符号位?

问题描述

我检查了sys.maxsizePython 3.6 中的帮助:

>>> 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 位,表示一个前导符号位。但是,容器的长度不能为负数。

这里发生了什么?

标签: pythonpython-3.xcontainerssizesigned

解决方案


在 Python 2.5 中,容器的最大大小从 2 31 -1 增加到 2 63 -1。PEP 353:使用 ssize_t 作为索引类型,它引入了变化,

为什么不 size_t

实现此功能的初始尝试尝试使用 size_t。很快发现这是行不通的:Python 在许多地方使用负索引(表示从末尾开始计数)。即使在 size_t 可以使用的地方,在必要时也需要对代码进行过多的重新表述,例如在循环中,例如:

for(index = length-1; index >= 0; index--)

如果 index 从 int 更改为 size_t,此循环将永远不会终止。

因此,限制源于决定使用 Python 特定的“索引”类型,将其定义为有符号 (ssize_t) 而不是无符号 (size_t) 以便于处理负索引。


推荐阅读