Acabo de comenzar con Python, por lo que probablemente este sea mi error, pero ...
Estoy probando Python. Me gusta usarlo como calculadora y estoy trabajando lentamente en algunos tutoriales.
Hoy me encontré con algo extraño. Quería averiguar 2013 * 2013, pero escribí algo incorrecto y escribí 2013 * 013, y obtuve esto:
>>> 2013*013
22143
Verifiqué con mi calculadora, ¡y 22143 es la respuesta incorrecta! Se supone que 2013 * 13 es 26169.
¿Por qué Python me da una respuesta incorrecta? Mi vieja calculadora Casio no hace esto ...
python
python-2.7
math
James Elegan
fuente
fuente
Respuestas:
Debido a la aritmética octal, 013 es en realidad el número entero 11.
>>> 013 11
Con un cero a la izquierda,
013
se interpreta como un número de base 8 y 1 * 8 1 + 3 * 8 0 = 11.Nota: este comportamiento se cambió en Python 3 . Aquí hay una cita particularmente apropiada de PEP 3127
fuente
0123
sintaxis sea ilegal y siempre requiere0o123
.0
prefijo seguido de 0-8 es octal.0x
El prefijo seguido de 0-9a-f es hexadecimal.0
prefijo seguido por 0- 7 es octal :)013
es un literal entero octal (equivalente al literal entero decimal11
), debido al 0 inicial.>>> 2013*013 22143 >>> 2013*11 22143 >>> 2013*13 26169
Es muy común (ciertamente en la mayoría de los lenguajes con los que estoy familiarizado) que los literales enteros octales comiencen con
0
y los literales enteros hexadecimales comiencen con0x
. Debido a la confusión exacta que experimentó, Python 3 genera un SyntaxError:>>> 2013*013 File "<stdin>", line 1 2013*013 ^ SyntaxError: invalid token
y requiere una
0o
o en su0O
lugar:>>> 2013*0o13 22143 >>> 2013*0O13 22143
fuente
La sintaxis de 'cero inicial' de Python para literales octales es un problema común:
Python 2.7.3 >>> 010 8
La sintaxis se cambió en Python 3.x http://docs.python.org/3.0/whatsnew/3.0.html#integers
fuente
Esto se trata principalmente de expandir un poco la respuesta de @ Wim, pero Python indica la base de literales enteros usando ciertos prefijos. Sin un prefijo, los números enteros se interpretan como en base 10. Con un "0x", el número entero se interpretará como un int hexadecimal. La especificación gramatical completa está aquí, aunque es un poco difícil de entender si no está familiarizado con las gramáticas formales: http://docs.python.org/2/reference/lexical_analysis.html#integers
Básicamente, la tabla dice que si desea un valor largo (es decir, uno que exceda la capacidad de un int normal), escriba el número seguido de la letra "L" o "l"; si desea que su número se interprete en decimal, escriba el número normalmente (sin 0 a la izquierda); si desea que se interprete en octal, antepóngalo con "0", "0o" o "0O"; si lo desea en hexadecimal, anteponga "0x"; y si lo desea en binario, anteponga "0b" o "0B".
fuente
int
(y en realidad podría estar equivocado acerca de que haya uno): mi propia memoria se remonta a ser bastante seguro que 2.4 no lo necesitaba. Pero sí, generalmente vale la pena pasar a Python 3 si no depende de ninguna biblioteca que aún no se haya adaptado.