2009-06-14 19 views
13

¿Por qué no puedo tener 008 o 009 como claves para un dict de Python, pero 001-007 están bien? Ejemplo:¿Por qué las claves 008 y 009 no son válidas para los dictados de Python?

some_dict = { 
    001: "spam", 
    002: "eggs", 
    003: "foo", 
    004: "bar", 
    008: "anything", # Throws a SyntaxError 
    009: "nothing" # Throws a SyntaxError 
    } 

actualización: Problema resuelto. No sabía que comenzar un literal con un cero lo convertía en octal. Eso parece realmente extraño. ¿Por qué cero?

+2

¿Por qué en Python? Precendente histórico (C lo hizo). No tengo idea de por qué estaba en C, porque estoy de acuerdo en que es bastante tonto. – Jacob

+2

sí, estamos atrapados con eso. Si tiene que tener los ceros, hágalos en su lugar. El diccionario funcionará bien. –

+0

Los literales occidentales solían estar representados con una "o" (es decir, o73). No sé por qué se cambió a cero (0) en los idiomas de tipo C. Los números hexadecimales (base 16) se han representado con un prefijo x (o 0x) o un sufijo 'h' (0x2AE, 2AEh). Y algunos idiomas han usado el prefijo 'b' para representar números binarios. –

Respuesta

28

en Python y otros lenguajes, si se inicia un número con un 0, el número se interpreta como si estuviese en octal (base 8), donde solo 0-7 son dígitos válidos. Vas a tener que cambiar el código para esto:

some_dict = { 
    1: "spam", 
    2: "eggs", 
    3: "foo", 
    4: "bar", 
    8: "anything", 
    9: "nothing" } 

O si los ceros iniciales son muy importantes, utilizar cadenas para las teclas.

+4

Realmente, realmente desearía que K & R no hubiera presentado esa convención para octal (supongo que eran ellos) ... –

+0

@Michael - parece que K & R puede haber elegido '0' pero el prefijo para octal parece ser anterior a ellos. Lo remonté a la definición original de BCPL. Probablemente escogieron '0' como una exquisitez para el lexer. –

+0

No me molesta tanto que sea una convención de C. Lo que me molesta es que otros lenguajes tipo C (sin contar aquellos diseñados para ser directamente compatibles) lo copiaron. No me había dado cuenta de que la convención existía en Python. Ick. –

10

Python toma 008 y 009 como números octales, por lo tanto ... inválido.

Solo puede ir hasta 007, luego el siguiente número sería 010 (8) y luego 011 (9). Pruébalo en un intérprete de Python, y verás a qué me refiero.

8

En Python (y muchos otros idiomas), a partir de un número con un líder "0" indica unnúmero octal (base 8). El uso de esta notación de cero inicial se llama octal literal. Los números octales van 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, etc. Así que 08 (en octal) no es válido.

Si elimina los ceros a la izquierda, el código va a estar bien:

some_dict = 
{ 
    1: "spam", 
    2: "eggs", 
    3: "foo", 
    4: "bar", 
    8: "anything", 
    9: "nothing" 
} 
7

@DoxaLogos tiene razón. No es que sean claves inválidas, son literales inválidos. Si intentas usarlos en cualquier otro contexto, obtendrías el mismo error.

2

Esto se debe a que, cuando se inicia un número con 0, se interpreta como un número octal. Como 008 y 009 no son números octales, falla.

A 0 precede un número octal para que no tenga que escribir (127)₈. Del Wikipedia page: "A veces, los números octales se representan precediendo un valor con un 0 (por ejemplo, en Python 2.x o JavaScript 1.x, aunque ahora está obsoleto en ambos)".

Cuestiones relacionadas