理解Python数字命理

4 投票
4 回答
670 浏览
提问于 2025-04-17 12:05

我们不能声明一个以0开头的整数。

>>> n = 08
SyntaxError: invalid token

但是我们可以声明一个全是0的变量。

>>> n = 00000
>>> print n
>>> 0

所以问题来了,为什么在第一个情况下,Python不直接把变量的值看作n = 8,而是抛出一个错误,忽略左边的0呢?而在第二个情况下,它却把全是0的值当作有效的值。

再考虑另一个情况。

>>> n = '0008'
>>> print int(n)
>>> 8

在第三种情况下,它仍然把这个值视为有效的数字,为什么这里没有抛出错误呢?

4 个回答

3

关于为什么会出现这个错误,其他人已经回答过了。Python 对于 数字字面量 有一个约定:以 0 开头的数字被认为是八进制。如果在这样的数字中放入一个大于 7 的数字,就会出现错误。不过在 Python 3 中,这个约定发生了变化,所有以 0 开头的数字都会引发错误。

第二个问题是为什么 int 不会引发这个错误。int 不会引发错误,因为它有自己的规则来指定字符串的进制:可以提供一个可选的第二个参数,默认值是 10。这让 int 能够接受更广泛的值,而不必担心会产生歧义。举个例子:

>>> int('55', 16)
85
>>> int('0x55', 16)
85

这里指定了进制,所以没有歧义。如果拒绝以常规的 0x 开头的字符串,那就会造成麻烦。同样,当进制明确为 10 时,拒绝以 0 开头的字符串也是不合理的。

总的来说,我认为一个编程语言在处理字面量时严格一些是有道理的,但在类型转换时则可以灵活一些。

4

在大多数编程语言中,前面加个0表示这是一个八进制数(也就是以8为基数的数)。

在Python 2.7中,我得到的是:

>>> n = 010
>>> n
8

我想你的问题可能出在别的地方。(不过如果是版本问题,我想他们可能觉得几乎没有人会想要直接写一个八进制的变量,所以就把它当成错误处理了)。

-- 编辑:

确实,八进制的写法在Python 3.0中发生了变化:

http://docs.python.org/release/3.0.1/whatsnew/3.0.html#new-syntax

现在的写法是:

>>> n = 0o10
>>> n
8

(在2.6及以上版本中有效)

10

以0开头且没有小数点的数字会被当作八进制数来理解(只用数字0到7)。所以08这个数字在八进制中是不合法的。根据PEP索引,"在Python 3.0中,将不再支持用前导零来表示八进制数(在2.6的Python 3.0预览模式中也是如此),如果一个数字前面有'0',后面紧跟着另一个数字,就会出现语法错误"。详细信息可以在这里找到:http://www.python.org/dev/peps/pep-3127/

撰写回答