На 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"
Немає обмеження для довжини цілих букв, крім того, що може зберігатися у доступній пам'яті.
Зверніть увагу, що провідні нулі в ненульовому десятковому числі не допускаються. Це для розбіжностей з восьми буквальними буквами у стилі С, які Python використовував до версії 3.0.
Як зазначалося тут, провідні нулі в ненульовому десятковому числі не допускаються. "0"+
є юридичним як дуже особливий випадок, якого не було в Python 2 :
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN-комітет 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" буде одразу слідує ще одна цифра .
(наголос мій)
Отже, той факт, що дозволено кілька нулів, технічно порушує ПЕП, і в основному був реалізований як особливий випадок Георга Брандла. Він вніс відповідну зміну документації, щоб відзначити, що це "0"+
було дійсною справою decimalinteger
(раніше це стосувалося octinteger
).
Ми, мабуть, ніколи точно не дізнаємось , чому Георг вирішив зробити "0"+
дійсним - це може назавжди залишитися випадковим кутовим випадком у Python.
ОНОВЛЕННЯ [28 липня 2015]: Це питання призвело до бурхливої дискусійної теми про ідеї пітона, на яку Георг звучав :
Стівен Д'Апрано написав:
Чому це було визначено саме так? [...] Чому б ми писали 0000, щоб отримати нуль?
Я міг би сказати тобі, але тоді я мав би тебе вбити.
Георг
Пізніше нитка породила цей звіт про помилку, спрямований на те, щоб позбутися цього особливого випадку. Ось Георг каже :
Я не пригадую причину цієї навмисної зміни (як видно із змін у документах).
Зараз я не можу придумати вагомих причин для цієї зміни [...]
і таким чином ми маємо це: точна причина цієї суперечливості втрачається в часі.
Нарешті, зауважте, що звіт про помилку було відхилено: провідні нулі й надалі прийматимуться лише за нульовими цілими числами для решти Python 3.x.