2015-05-17 18 views
5

Słowniki w python powinny mieć unikalne klucze. Dlaczego masz pozwolenie na zrobienie tego ...Dlaczego Python pozwala na tworzenie słowników z duplikatami kluczy

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

Czy nie powinien to być jakiś błąd?

+8

Możesz być zainteresowany w czytaniu [Python na zgłoszenia o dokładnym tej kwestii] (https://bugs.python.org/issue16385). Rozdzielczość: odrzucona. –

+0

dlaczego miałoby to być? klucze są unikalne, wartość jest po prostu nadpisana zgodnie z oczekiwaniami. Nie ma duplikatów kluczy. Jestem pewien, że jest to również duplikat, ale nie mogę teraz znaleźć duplikatu. –

+1

Dobre pytanie - nigdy o tym nie wiedziałem. Interesujące uzasadnienie: Terry wydaje się myśleć, że istnieją przypadki użycia, które uzasadniają takie zachowanie. – GreenAsJade

Odpowiedz

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

Nie, to po prostu jesteś inicjowanie dict przy użyciu uprzednio istniejący klucz, który po prostu zbyt zapisuje aktualną wartość dla istniejącego klucza.

>>> 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 

Jak widać, dwa sposoby inicjalizacji są w pewnym stopniu podobne: pierwsza para klucz-wartość jest zapisywana jako pierwsza i druga.

+3

Dokładnie o to pytają. Zastanawiają się ** dlaczego to nie jest błąd **. –

0

Nie. Po prostu nadpisuje klucze.

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

Czy zastąpienie klucza jest błędem? Nie powinno. W przeciwnym razie będziesz mieć milion błędów podczas próby zaktualizowania rzeczy w słowniku. Powodem, dlaczego myślę, że to nie jest to błąd (wyjaśniając kod w języku angielskim):

 
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. 
Powiązane problemy