Python无法处理以0开头的数字字符串。为什么?

时间:2012-10-22 14:31:30

标签: python python-3.x syntax-error

我刚刚在我的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

现在,我已经看到this但是正如链接所说,对于八进制的0在python中不再起作用(即在python3中不起作用)。但这不意味着应该正确解释以0开头的数字的行为吗?在base-2中还是在正常的base-10表示中?既然不是这样,为什么python表现得那样呢?这是一个实施问题吗?或者这是一个语义问题?

2 个答案:

答案 0 :(得分:31)

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

a = 012 + 013

然后你将它移植到python 3并且它仍然可以工作 - 它只是给你a = 25而不是你预期的a = 21(十进制)。有乐趣追踪那个错误。

答案 1 :(得分: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