22

我刚刚在我的 python 解释器上执行了以下程序:

>>> def mylife(x):
...     if x>0:
...             print(x)
...     else:
...             print(-x)
... 
>>> mylife(01)
File "<stdin>", line 1
mylife(01)
        ^
SyntaxError: invalid token
>>> mylife(1)
1
>>> mylife(-1)
1
>>> mylife(0)
0

现在,我已经看到了这一点,但正如链接所说,八进制的 0 在 python 中不再起作用(即在 python3 中不起作用)。但这是否意味着应该正确解释以 0 开头的数字的行为?以 2 为基数还是以正常的以 10 为基数表示?既然不是这样,为什么python会这样呢?是执行问题吗?还是语义问题?

4

2 回答 2

32

我的猜测是,由于012在 python3.x 中不再是八进制常量,他们不允许使用012语法以避免奇怪的向后兼容性错误。考虑使用八进制文字常量的 python2.x 脚本:

a = 012 + 013

然后你将它移植到 python 3,它仍然可以工作——它只是给你a = 25而不是a = 21你以前期望的(十进制)。玩得开心追踪那个错误。

于 2012-10-22T14:33:39.980 回答
15

来自 Python 3 发行说明http://docs.python.org/3.0/whatsnew/3.0.html#integers

八进制文字不再是0720; 改为使用0o720

Python 2.x 中八进制文字的“前导零”语法是一个常见的陷阱:

Python 2.7.3
>>> 010
8

正如您所发现的,在 Python 3.x 中这是一个语法错误:

Python 3.3.0
>>> 010
  File "<stdin>", line 1
    010
      ^
SyntaxError: invalid token

您仍然可以像以往一样从带有前导零的字符串转换:

>>> int("010")
10
于 2013-04-09T18:17:09.367 回答