Почему 000 оценивает значение 0 в Python 3?

Так как восьмеричный префикс теперь 0o в Python 3, это не законно писать 0777. Хорошо.

Итак, почему законно писать 00, который правильно оценивает значение 0, тогда как другие цифры вызывают синтаксическую ошибку?

>>> 01
  ...
  File "<interactive input>", line 1
    01
     ^
SyntaxError: invalid token
>>> 
>>> 00
0

Ответ 1

Если вы посмотрите на Lexical Analysis (Целевая строка):

integer      ::=  decinteger | bininteger | octinteger | hexinteger
decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+(["_"] "0")*
...

Итак, это означает, что a decinteger либо начинается с ненулевой цифры (за которой следуют все возможные цифры и, возможно, подчеркивания), либо является последовательностью нулей с необязательным подчеркиванием (которое сопоставляется нулю).

Кроме того, в документации указано, что:

Обратите внимание, что ведущие нули в отличном от нуля десятичном числе имеют не.

Итак, это означает, что они делают исключение для нуля (во всей документации для можно найти там): вы можете записать нуль как последовательность нулей. Я предполагаю, что, конечно, они должны включать "0" (как иначе вы бы указали нуль как decinteger?), Поэтому почему бы не разрешить больше нулей в этом случае, независимо от числовой системы, 000 есть и остается нуль. Вероятно, они не хотят разрешать 01 как decinteger для предотвращения случайного запуска и таким образом получить совершенно разные результаты.

Наконец, обратите внимание, что подчеркивания являются лишь частью этой спецификации, поскольку : в спецификации для 3.5 они не упоминаются в грамматике.

В документация определяет нуль, за которым следуют другие цифры (также другие нули как octinteger:

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"
octinteger     ::=  "0" ("o" | "O") octdigit+ | "0" octdigit+