Perché i 008 e 009 chiavi non valide per dicts Python?
-
13-09-2019 - |
Domanda
Perché è che non posso avere 008 o 009 chiavi per essere un dict Python, ma 001-007 vanno bene? Esempio:
some_dict = {
001: "spam",
002: "eggs",
003: "foo",
004: "bar",
008: "anything", # Throws a SyntaxError
009: "nothing" # Throws a SyntaxError
}
Aggiorna : Problema risolto. Non ero a conoscenza che a partire un letterale con uno zero ha reso ottale. Che sembra davvero strano. Perché a zero?
Soluzione
in Python e altri linguaggi, se si avvia un numero con uno 0, il numero viene interpretato come essere in ottale (base 8), dove solo 0-7 sono cifre valide. Dovrete modificare il codice per questo:
some_dict = {
1: "spam",
2: "eggs",
3: "foo",
4: "bar",
8: "anything",
9: "nothing" }
O se gli zeri iniziali sono molto importanti, usare le stringhe per le chiavi.
Altri suggerimenti
Python prende 008 e 009 come numeri ottali, quindi ... non validi.
Si può solo salire a 007, quindi il numero successivo sarebbe 010 (8) poi 011 (9). Provatelo in un interprete Python, e vedrete cosa intendo.
In Python (e molte altre lingue), iniziando un numero con uno "0" indica un numero ottale (base 8). L'utilizzo di questo leader zero notazione è chiamato un ottale letterale . numeri ottali vanno 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, ecc Quindi 08 (in ottale) non è valido .
Se si rimuove gli zeri iniziali, il codice andrà bene:
some_dict =
{
1: "spam",
2: "eggs",
3: "foo",
4: "bar",
8: "anything",
9: "nothing"
}
@DoxaLogos è giusto. Non è che sono le chiavi non valide - sono letterali non validi. Se si è tentato di utilizzarli in qualsiasi altro contesto, si otterrebbe lo stesso errore.
Questo perché, quando si avvia un numero con una 0
, viene interpretato come un numero ottale. Dal momento che 008
e 009
non sono numeri ottali, non riesce.
Un 0
precede un numero ottale in modo che non si deve scrivere (127)₈
. Dal Wikipedia pagina : "numeri ottali A volte sono rappresentati da un valore precedente con uno 0 (per esempio in 2.x Python o 1.x JavaScript - anche se ora è deprecato in entrambi). "