2009-06-14 8 views
13

Perché non posso avere 008 o 009 chiavi per un dettato Python, ma 001-007 vanno bene? Esempio:Perché le chiavi non valide 008 e 009 per dict Python?

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

Aggiornamento: Problema risolto. Non ero consapevole che l'avvio di un letterale con uno zero lo rendesse ottale. Sembra davvero strano. Perché zero?

+2

Perché in Python? Precedenti storici (C l'ha fatto). Non ho idea del perché fosse in C, perché sono d'accordo sul fatto che sia piuttosto sciocco. – Jacob

+2

sì, siamo bloccati con esso. Se devi avere gli zeri, crea invece delle stringhe. Il dizionario funzionerà correttamente. –

+0

I letterali ottali venivano rappresentati con una "o" (cioè o73). Non so perché è stato modificato a zero (0) nei linguaggi di tipo C. I numeri esadecimali (base 16) sono stati rappresentati con un prefisso x (o 0x) o un suffisso 'h' (0x2AE, 2AEh). E alcune lingue hanno usato il prefisso 'b' per rappresentare numeri binari. –

risposta

28

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, utilizzare stringhe per le chiavi.

+4

Mi piacerebbe davvero tanto che K & R non abbia escogitato quella convenzione per ottale (presumo fossero loro) ... –

+0

@Michael - sembra che K & R abbia scelto '0' ma la forma del prefisso per ottale sembra anticiparli. Ho rintracciato la definizione originale BCPL. Probabilmente hanno scelto lo "0" come una gentilezza per il lexer. –

+0

Non mi infastidisce più di tanto che si tratti di una convenzione C. Ciò che mi infastidisce è che altri linguaggi simili a C (senza contare quelli progettati per essere direttamente compatibili) lo hanno copiato. Non avevo realizzato che la convenzione esistesse in Python. Ick. –

10

Python accetta 008 e 009 come numeri ottali, quindi ... non valido.

È possibile passare solo a 007, quindi il numero successivo sarà 010 (8) quindi 011 (9). Provalo in un interprete Python e vedrai cosa intendo.

8

In Python (e molte altre lingue), iniziando un numero con uno "0" indica unnumero ottale (base 8). L'utilizzo di questa notazione a zero zero è denominata letterale ottale. I 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" 
} 
7

@DoxaLogos ha ragione. Non è che siano chiavi non valide: sono letterali non validi. Se provassi ad usarli in qualsiasi altro contesto, avresti lo stesso errore.

2

Questo perché, quando si avvia un numero con un 0, viene interpretato come un numero ottale. Poiché 008 e 009 non sono numeri ottali, non riesce.

A 0 precede un numero ottale in modo da non dover scrivere (127)₈. Da Wikipedia page: "Talvolta i numeri ottali sono rappresentati precedendo un valore con uno 0 (ad esempio in Python 2.xo JavaScript 1.x - anche se ora è deprecato in entrambi)."

Problemi correlati