Según https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Los literales enteros se describen mediante las siguientes definiciones léxicas:
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"
No hay límite para la longitud de los literales enteros aparte de lo que se puede almacenar en la memoria disponible.
Tenga en cuenta que no se permiten ceros a la izquierda en un número decimal distinto de cero. Esto es para la desambiguación con literales octales de estilo C, que Python usaba antes de la versión 3.0.
Como se indica aquí, no se permiten ceros a la izquierda en un número decimal distinto de cero . "0"+
es legal como un caso muy especial, que no estaba presente en Python 2 :
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN commit r55866 implementó PEP 3127 en el tokenizador, que prohíbe los 0<octal>
números antiguos . Sin embargo, curiosamente, también agrega esta nota:
/* in any case, allow '0' as a literal */
con una nonzero
bandera especial que solo arroja un SyntaxError
si la siguiente secuencia de dígitos contiene un dígito distinto de cero.
Esto es extraño porque PEP 3127 no permite este caso:
Este PEP propone que la capacidad de especificar un número octal mediante el uso de un cero a la izquierda se eliminará del lenguaje en Python 3.0 (y el modo de vista previa de Python 3.0 de 2.6), y que se generará un SyntaxError siempre que un "0" a la izquierda sea seguido inmediatamente por otro dígito .
(énfasis mío)
Entonces, el hecho de que se permitan múltiples ceros está violando técnicamente el PEP, y fue básicamente implementado como un caso especial por Georg Brandl. Hizo el correspondiente cambio de documentación para señalar que "0"+
era un caso válido para decimalinteger
(anteriormente que se había cubierto en octinteger
).
Probablemente nunca sabremos exactamente por qué Georg eligió hacer "0"+
válido: puede seguir siendo para siempre un caso extraño en Python.
ACTUALIZACIÓN [28 de julio de 2015]: Esta pregunta dio lugar a un animado hilo de discusión sobre las ideas de Python en el que Georg intervino :
Steven D'Aprano escribió:
¿Por qué se definió de esa manera? [...] ¿Por qué escribiríamos 0000 para obtener cero?
Podría decírtelo, pero luego tendría que matarte.
Georg
Más tarde, el hilo generó este informe de error con el objetivo de deshacerse de este caso especial. Aquí, Georg dice :
No recuerdo la razón de este cambio deliberado (como se ve en el cambio de documentos).
No puedo encontrar una buena razón para este cambio ahora [...]
y así lo tenemos: la razón precisa detrás de esta inconsistencia se pierde en el tiempo.
Finalmente, tenga en cuenta que el informe de error fue rechazado: los ceros iniciales seguirán siendo aceptados solo en números enteros cero para el resto de Python 3.x.