Na https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Literały całkowite są opisane za pomocą następujących definicji leksykalnych:
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"
Nie ma ograniczeń co do długości literałów całkowitych poza tym, co można przechowywać w dostępnej pamięci.
Należy pamiętać, że zera wiodące w niezerowej liczbie dziesiętnej są niedozwolone. Służy to do ujednoznacznienia literałów ósemkowych w stylu C, których Python używał przed wersją 3.0.
Jak zauważono tutaj, zera wiodące w niezerowej liczbie dziesiętnej są niedozwolone. "0"+
jest legalny jako bardzo szczególny przypadek, którego nie było w Pythonie 2 :
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
Zatwierdzenie SVN r55866 zaimplementowało PEP 3127 w tokenizerze, który zabrania starych 0<octal>
numerów. Jednak, co ciekawe, dodaje również tę notatkę:
/* in any case, allow '0' as a literal */
ze specjalną nonzero
flagą, która rzuca a tylko SyntaxError
wtedy, gdy następująca sekwencja cyfr zawiera cyfrę niezerową.
To dziwne, ponieważ PEP 3127 nie zezwala na ten przypadek:
Ten dokument PEP proponuje, że możliwość określenia liczby ósemkowej za pomocą zera wiodącego zostanie usunięta z języka w Pythonie 3.0 (i trybie podglądu Pythona 3.0 w wersji 2.6), i że SyntaxError zostanie zgłoszony, gdy początkowe „0” zostanie zaraz po niej następuje kolejna cyfra .
(podkreślenie moje)
Tak więc fakt, że dozwolone jest wielokrotne zerowanie, technicznie narusza PEP i został w zasadzie zaimplementowany jako przypadek specjalny przez Georga Brandla. Dokonał odpowiedniej zmiany w dokumentacji, aby zauważyć, że "0"+
jest to uzasadnionedecimalinteger
(poprzednio był objęty zakresem octinteger
).
Prawdopodobnie nigdy nie dowiemy się dokładnie, dlaczego Georg zdecydował się zrobić"0"+
poprawnym - może to na zawsze pozostać dziwnym przypadkiem narożnym w Pythonie.
AKTUALIZACJA [28 lipca 2015 r.]: To pytanie doprowadziło do ożywionej dyskusji na temat pomysłów na Pythona, do której dołączył Georg :
Steven D'Aprano napisał:
Dlaczego zostało to tak zdefiniowane? […] Dlaczego mielibyśmy pisać 0000, żeby uzyskać zero?
Mógłbym ci powiedzieć, ale wtedy musiałbym cię zabić.
Georg
Później w wątku pojawił się ten raport o błędzie, mający na celu pozbycie się tego specjalnego przypadku. Tutaj, mówi Georg :
Nie przypominam sobie powodu tej celowej zmiany (jak widać ze zmiany dokumentów).
Nie mogę teraz wymyślić dobrego powodu dla tej zmiany [...]
i tak to mamy: dokładna przyczyna tej niespójności jest zagubiona w czasie.
Na koniec zwróć uwagę, że raport o błędzie został odrzucony: wiodące zera będą nadal akceptowane tylko w przypadku zerowych liczb całkowitych w pozostałej części Pythona 3.x.