Python не может обрабатывать строку чисел, начиная с 0. Почему?

Я просто выполнил следующую программу на моем интерпретаторе 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 ведет себя так? Это проблема внедрения? Или это семантическая проблема?

Ответ 1

Мое предположение заключается в том, что поскольку 012 больше не является восьмеричной константой литерала в python3.x, они не разрешают синтаксис 012, чтобы избежать странных ошибок обратной совместимости. Рассмотрим ваш python2.x script, который использует восьмеричные константы литерала:

a = 012 + 013

Затем вы переносите его на python 3, и он все еще работает. Он просто дает вам a = 25 вместо a = 21, как вы ожидали ранее (десятичный). Удачи, отслеживая эту ошибку.

Ответ 2

Из примечаний к выпуску 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