2012-07-23 29 views
39

Cuando escribo enteros pequeños con un 0 en python, dan resultados raros. ¿Por qué es esto?¿Qué significan los números que comienzan con 0 en python?

>>> 011 
9 
>>> 0100 
64 
>>> 027 
23 

Nota: Python versión 2.7.3 He probado esto en Python 3.0, y al parecer esto ahora es un error. Por lo tanto, es algo específico de la versión.

Editar: aunque aparentemente todavía enteros:

>>> type(027) 
`<type 'int'>` 

Respuesta

44

Estos son números representados en la base 8 (números octales). Por ejemplo,

011 es igual a 1*(8**1) + 1*(8**0) = 9,

0100 es igual a 1*(8**2) + 0*(8**1) + 0*(8**0) = 64,

027 es igual a 2*(8**1) + 7*(8**0) = 16 + 7 = 23.

+0

Quizás el asterisco doble no es la manera más clara de indicar una exponencial. Si se trata de una Stataroverflow stantard, o en cualquier otro lugar, debe ser cambiado. –

+11

@DavidL: En Python, ['**' es el operador exponencial] (https://docs.python.org/2/tutorial/introduction.html#numbers), y ['^' es XOR bit a bit] (https : //wiki.python.org/moin/BitwiseOperators). – unutbu

+1

Solo tenga en cuenta que, en Python 3, ingresar '011' dará como resultado' SyntaxError: invalid token'. Use '0o11' en su lugar. – chenghuayang

5

Estos son los números octales (base 8, los valores 0 - 7)

Puede convertir un número decimal a octal con la función oct().

In [125]: for i in range(10): 
    .....:  print '{:5} {:5}'.format(i, oct(i)) 
    .....: 
    0 0 
    1 01 
    2 02 
    3 03 
    4 04 
    5 05 
    6 06 
    7 07 
    8 010 
    9 011 

y convertir un valor octal a entero con la función int() con la base apropiada (8 en este caso):

int(str(17), 8) 
Out[129]: 15 

El conjunto similar de reglas/aplican funciones para números hexadecimales (base 16) utilizando la función hex().

5

Números en el sistema numérico Octal. Otros prefijos son 0x para hexadecimal y 0b para binario.

+3

Y tenga en cuenta que en Python 3, los ceros a la izquierda no están permitidos y debe usar '0o' para octal. –

34

En Python 2 (y algunos más lenguajes de programación), estos representan octal numbers.

En Python 3, 011 ya no funciona y en su lugar usaría 0o11.

En respuesta a la modificación: y son números enteros regulares. Se especifican de otra manera; y Python los convierte automáticamente a una representación entera interna (que en realidad es base-2, por lo que tanto 9 como 011 se convierten internamente a 0b1001).

2

Aparentemente son números octales (base 8), y el 0 es simplemente un prefijo desactualizado que Python 2 solía usar.

En Python 3 debe escribir: 0o11 en su lugar.

Todavía son enteros, pero realizar operaciones con ellos dará como resultado una forma regular de base 10.

4

Ambas versiones de Python 2 & 3 entienden octal escrito con '0o' y '0O' (mayúscula o), así que acostúmbrate a usarlo si también trabajas con Python 2.x.

Solo usa los ceros iniciales en números en cadenas.

Puede convertir enteros de cualquiera de los otros sistemas base con int().

>>> int(0o20)

16 

Si desea que su salida para que aparezca con ceros a la izquierda, a continuación, lo definen por esta respuesta: Display number with leading zeros

Si alguna vez va a trabajar con los códigos postales, que es mejor para tratar ellos como cuerdas en todos los sentidos.

Cuestiones relacionadas