Per https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Ganzzahlige Literale werden durch die folgenden lexikalischen Definitionen beschrieben:
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"
Es gibt keine Begrenzung für die Länge von Ganzzahlliteralen, abgesehen davon, was im verfügbaren Speicher gespeichert werden kann.
Beachten Sie, dass führende Nullen in einer Dezimalzahl ungleich Null nicht zulässig sind. Dies dient zur Disambiguierung mit Oktalliteralen im C-Stil, die Python vor Version 3.0 verwendet hat.
Wie hier erwähnt, sind führende Nullen in einer Nicht-Null- Dezimalzahl nicht zulässig. "0"+
ist als ganz besonderer Fall legal, der in Python 2 nicht vorhanden war :
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN Commit r55866 hat PEP 3127 im Tokenizer implementiert, wodurch die alten 0<octal>
Nummern verboten werden. Seltsamerweise fügt es jedoch auch diesen Hinweis hinzu:
/* in any case, allow '0' as a literal */
mit einem speziellen nonzero
Flag, das nur dann ein a auslöst, SyntaxError
wenn die folgende Ziffernfolge eine Ziffer ungleich Null enthält.
Dies ist seltsam, da PEP 3127 diesen Fall nicht zulässt:
In diesem PEP wird vorgeschlagen, dass die Möglichkeit, eine Oktalzahl mithilfe einer führenden Null anzugeben, aus der Sprache in Python 3.0 (und dem Python 3.0-Vorschaumodus 2.6) entfernt wird und dass ein SyntaxError immer dann ausgelöst wird, wenn eine führende "0" angezeigt wird unmittelbar gefolgt von einer weiteren Ziffer .
(Hervorhebung von mir)
Die Tatsache, dass mehrere Nullen zulässig sind, verstößt technisch gegen das PEP und wurde von Georg Brandl grundsätzlich als Sonderfall implementiert. Er nahm die entsprechende Dokumentationsänderung vor, um festzustellen, dass dies "0"+
ein gültiger Fall war decimalinteger
(zuvor unter octinteger
).
Wir werden wahrscheinlich nie genau wissen , warum Georg sich für die "0"+
Gültigkeit entschieden hat - es kann für immer ein seltsamer Eckfall in Python bleiben.
UPDATE [28. Juli 2015]: Diese Frage führte zu einem lebhaften Diskussionsthread über Python-Ideen, in dem Georg sich einmischte :
Steven D'Aprano schrieb:
Warum wurde es so definiert? [...] Warum sollten wir 0000 schreiben, um Null zu bekommen?
Ich könnte es dir sagen, aber dann müsste ich dich töten.
Georg
Später brachte der Thread diesen Fehlerbericht hervor , um diesen Sonderfall loszuwerden. Hier sagt Georg :
Ich erinnere mich nicht an den Grund für diese absichtliche Änderung (wie aus der Änderung der Dokumente hervorgeht).
Ich kann jetzt keinen guten Grund für diese Änderung finden [...]
und so haben wir es: Der genaue Grund für diese Inkonsistenz geht mit der Zeit verloren.
Beachten Sie schließlich, dass der Fehlerbericht abgelehnt wurde: Führende Nullen werden für den Rest von Python 3.x weiterhin nur mit Ganzzahlen von Null akzeptiert.