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

Python无法处理以0开头的数字字符串。为什么?,python,python-3.x,syntax-error,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 >>&

我刚刚在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
>>定义mylife(x):
...     如果x>0:
...             打印(x)
...     其他:
...             打印(-x)
... 
>>>我的生命(01)
文件“”,第1行
我的生命(01)
^
SyntaxError:无效令牌
>>>我的生活(1)
1.
>>>我的生命(-1)
1.
>>>我的生活(0)
0

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

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

a = 012 + 013

然后将它移植到Python3,它仍然可以工作——它只提供
a=25
,而不是像您之前期望的那样提供
a=21
(十进制)。从Python3发行说明中找到这个bug,玩得开心。

八进制文字的形式不再是
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

是的。似乎是一个很好的解释,尽可能的设计决策。可能是两年后,当大部分东西都被移植时,那么,我认为,这个特性应该再次被允许。谢谢让人想起“程序员为什么把圣诞节和万圣节搞混了”——“因为12月25日是10月31日”;P@JonClements--我以前从未见过这个--相当聪明--我想这可能是我从未上过的一门CS课程中提到的。@mgilson可能是一个很好的理由。这解释了为什么
000
仍然有效:
>>> int("010")
10