2015-05-17 21 views
5

I dizionari in python dovrebbero avere chiavi univoche. Perché sei autorizzato a farlo ...Perché python ti permette di creare dizionari con chiavi duplicate

d = {'a' : 'b', 'a' : 'c'} 

Non dovrebbe questo tipo di errore?

+8

Si può essere interessati a leggere [bug report Python su questo problema esatto] (https://bugs.python.org/issue16385). Risoluzione: respinta. –

+0

perché dovrebbe? le chiavi sono ancora uniche, il valore è appena finito come previsto. Non ci sono chiavi duplicate. Sono sicuro che questa è una domanda doppia e proprio non riesco a trovare il duplicato in questo momento. –

+1

Buona domanda - Non l'ho mai saputo. Razionale interessante: Terry sembra pensare che ci siano casi d'uso che giustificano questo comportamento. – GreenAsJade

risposta

6
>>> d = {'a' : 'b', 'a' : 'c'} 
>>> d 
{'a': 'c'} 

No, è solo il gioco è l'inizializzazione di una dict usando la chiave pre-esistente, che poco più-scrive il valore corrente per la chiave esistente.

>>> dis.dis("d = {'a' : 'b', 'a' : 'c'}") 
    1   0 BUILD_MAP    2 
       3 LOAD_CONST    0 ('b') 
       6 LOAD_CONST    1 ('a') 
       9 STORE_MAP 
      10 LOAD_CONST    2 ('c') 
      13 LOAD_CONST    1 ('a') 
      16 STORE_MAP 
      17 STORE_NAME    0 (d) 
      20 LOAD_CONST    3 (None) 
      23 RETURN_VALUE 

>>> dis.dis("d={};d['a']='b';d['a']='c'") 
    1   0 BUILD_MAP    0 
       3 STORE_NAME    0 (d) 
       6 LOAD_CONST    0 ('b') 
       9 LOAD_NAME    0 (d) 
      12 LOAD_CONST    1 ('a') 
      15 STORE_SUBSCR 
      16 LOAD_CONST    2 ('c') 
      19 LOAD_NAME    0 (d) 
      22 LOAD_CONST    1 ('a') 
      25 STORE_SUBSCR 
      26 LOAD_CONST    3 (None) 
      29 RETURN_VALUE 

Come si può vedere, due modi di inizializzazione sono un po 'allo stesso modo: prima chiave-valore è memorizzato prima poi secondo.

+3

Che è esattamente quello che stanno chiedendo. Si stanno chiedendo ** perché non è un errore **. –

0

Non funziona. Sovrascrive solo i tasti.

>>> d = {'a' : 'b', 'a' : 'c'} 
>>> d 
{'a': 'c'} 

È un errore sovrascrivere una chiave? Non dovrebbe. Altrimenti, avresti un milione di errori quando proverai ad aggiornare le cose in un dizionario. La ragione per cui penso che non c'è nessun errore è questo (il codice che spiega in inglese):

 
d is a dictionary. 
there is a key and a value. ('a' and 'b') 
Pair them up and enter them, while saving them. 
New entry ('a' and 'c') 
key 'a' already exists; update value. 
Problemi correlati