Согласно https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Целочисленные литералы описываются следующими лексическими определениями:
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"+
nonzerodigit ::= "1"..."9"
digit ::= "0"..."9"
octinteger ::= "0" ("o" | "O") octdigit+
hexinteger ::= "0" ("x" | "X") hexdigit+
bininteger ::= "0" ("b" | "B") bindigit+
octdigit ::= "0"..."7"
hexdigit ::= digit | "a"..."f" | "A"..."F"
bindigit ::= "0" | "1"
Нет ограничений на длину целочисленных литералов, кроме того, что может храниться в доступной памяти.
Обратите внимание, что ведущие нули в ненулевом десятичном числе не допускаются. Это сделано для устранения неоднозначности с восьмеричными литералами в стиле C, которые Python использовал до версии 3.0.
Как отмечено здесь, ведущие нули в ненулевом десятичном числе не допускаются. "0"+
является законным как особый случай, которого не было в Python 2 :
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN commit r55866 реализовал PEP 3127 в токенизаторе, который запрещает старые 0<octal>
номера. Однако, что любопытно, он также добавляет это примечание:
/* in any case, allow '0' as a literal */
со специальным nonzero
флагом, который выдает a, только SyntaxError
если следующая последовательность цифр содержит ненулевую цифру.
Это странно, потому что PEP 3127 не допускает этого случая:
Этот PEP предлагает, чтобы возможность указывать восьмеричное число с использованием ведущего нуля была удалена из языка в Python 3.0 (и в режиме предварительного просмотра Python 3.0 2.6), и что SyntaxError будет возникать всякий раз, когда ведущий "0" сразу после этого следует еще одна цифра .
(курсив мой)
Таким образом, допускаются несколько нулей. технически нарушает PEP и был в основном реализован Георгом Брандлом как особый случай. Он внес соответствующие изменения в документацию, чтобы отметить, что "0"+
это действительный случай decimalinteger
(ранее это было описано в разделе octinteger
).
Мы, вероятно, никогда не узнаем точно, почему Георг решил сделать "0"+
действительным - это может навсегда остаться странным случаем в Python.
ОБНОВЛЕНИЕ [28 июля 2015 г.]: этот вопрос привел к оживленной дискуссии по идеям Python, в которую вмешался Георг :
Стивен Д'Апрано писал:
Почему это было определено именно так? [...] Зачем нам писать 0000, чтобы получить ноль?
Я мог бы сказать тебе, но тогда мне пришлось бы убить тебя.
Georg
Позже поток породил этот отчет об ошибке с целью избавиться от этого особого случая. Здесь Георг говорит :
Я не помню причину этого преднамеренного изменения (как видно из изменения документации).
Сейчас я не могу придумать вескую причину для этого изменения [...]
и, таким образом, мы имеем: точная причина этого несоответствия потеряна со временем.
Наконец, обратите внимание, что отчет об ошибке был отклонен: ведущие нули по-прежнему будут приниматься только для нулевых целых чисел для остальной части Python 3.x.