为什么容器的最大大小有符号位?

时间:2019-03-01 04:46:54

标签: python python-3.x containers size signed

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

这是怎么回事?

1 个答案:

答案 0 :(得分:0)

在Python 2.5中,容器的最大大小从2 31 -1增加到2 63 -1。 PEP 353: Using ssize_t as the index type,它引入了更改,says

  

为什么不选择size_t

     

最初尝试实现此功能尝试使用size_t。它   很快就发现这行不通:Python使用负索引   在很多地方(表示从头算起)。即使在地方   size_t将在哪里可用,太多的代码重新编写在哪里   必要的,例如像这样的循环:

L1 = ['eins','zwei','drei','vier']
L2 = ['zwei','eins','vier','drei']
L3 = ['apfel','birne','banane','kirsche']

zipped = zip(L2,L3)
L4 = []

for i in L1:
    for e,g in zipped:
        if e == i:
            L4.append(g)

print L4
     

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

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