¿Por qué 000 evalúa a 0 en Python 3?

Dado que el prefijo octal ahora es 0o en Python 3, no es legal escribir 0777 más. Bueno.

Entonces, ¿por qué es legal escribir 00 que se evalúa correctamente a 0 mientras que otros dígitos activan un error de syntax?

 >>> 01 ... File "", line 1 01 ^ SyntaxError: invalid token >>> >>> 00 0 

Si uno mira la página de Análisis Léxico (Sección Literal Integral):

 integer ::= decinteger | bininteger | octinteger | hexinteger decinteger ::= nonzerodigit (["_"] digit)* | "0"+(["_"] "0")* ... 

Así que eso significa que un decinteger comienza con un dígito distinto de cero (seguido de todos los dígitos posibles y, opcionalmente, resalta), o es una secuencia de ceros con subrayados opcionalmente (que se asigna a cero).

La documentación además establece que:

Tenga en cuenta que los ceros iniciales en un número decimal distinto de cero no están permitidos.

Así que significa que hacen una excepción para cero (en toda la documentación para python-3.3 que se puede encontrar allí): puedes escribir cero como una secuencia de ceros. Mi conjetura es que, por supuesto, tienen que incluir "0" (¿de qué otra manera especificaría cero como decinteger ?), decinteger , ¿por qué no permitir más ceros en ese caso, independientemente del sistema numérico, 000 es y sigue siendo cero? Probablemente no quieran permitir que 01 como decinteger evite la ejecución accidental del código python-2.x y obtenga así resultados totalmente diferentes.

Finalmente, tenga en cuenta que los guiones bajos son solo parte de esa especificación desde python-3.6 : en las especificaciones de 3.5 no se mencionan en la gramática.

En Python-2.7, la documentación especifica un cero seguido de otros dígitos (también otros ceros como octinteger :

 integer ::= decimalinteger | octinteger | hexinteger | bininteger decimalinteger ::= nonzerodigit digit* | "0" octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+