为什么将int()的基值限制在36到2之间

时间:2019-01-18 17:50:09

标签: python int base

我发现当我在python中运行以下表达式

int(33, base=100)

我收到以下错误:

ValueError: int() base must be >= 2 and <= 36, or 0

我对此限制没有任何解释; another Stack Overflow question about the same error message没有提到为什么将基本参数限制为该范围。

3 个答案:

答案 0 :(得分:5)

解析base的{​​{1}}参数是在解析字符串时使用,而不是在将int传递给int时使用:

int

使用a,b,c,...,z代表10、11、12,...,35的数字是一种公认​​的惯例,但对于数字36中使用的符号没有惯例以37为底。

答案 1 :(得分:3)

首先:将字符串转换为数字时,只能为int()指定一个底数。假设您有一个带有十六进制数字的字符串,所以以16为底:

>>> int('2a', 16)
42

此结果与解释为不同基数的同一字符串有显着差异:

>>> int('2a', 11)
32
>>> int('2a', 29)
68

在视觉上呈现或从字符串表示形式解析整数值时,您只需要整数的基数。您可以通过许多不同的方式显示整数值,但是int对象是该值,不是视觉表示,并且没有基数,也不能更改该基数。

当逻辑扩展名已经支持十六进制表示法(数字0-9和字母A-F)时,也支持使用字母G-Z,而10位数字和26个字母使得可以使用基数36:

>>> int('zz', 36)
1295

进一步的基数将需要使用非字母数字符号,对此它们没有明确的预设顺序。

基数不能小于2;您无法计数仅用一位数字,value of 0就不会改变。

答案 2 :(得分:2)

这是一个实用的实现约定。您认为以100为基数的字符集是什么? :-)

使用数字和整个字母足够常见,因此base函数具有一组连续的可接受的基值,可以实现目前为止的功能。以1为底的就是len(arg)。

对于base-64编码也有约定;但是,在没有约定值37-63的情况下,base函数将radix-64值留给了单独的接口。