2014-04-30 17 views
10

Problemwartość Dołącz do jednej listy w słowniku dołącza wartość wszystkich list w słowniku

Tworzę słownik z pustych list jako wartości w następujący sposób.

>>> words = dict.fromkeys(['coach', 'we', 'be'], []) 

Słownik wygląda tak.

>>> words 
{'coach': [], 'be': [], 'we': []} 

Kiedy dołączam wartość do jednej listy, wartość jest dołączana do wszystkich z nich, jak w tym przykładzie.

>>> words['coach'].append('test') 
{'coach': ['test'], 'be': ['test'], 'we': ['test']} 

Pytanie

Moje pytanie składa się z dwóch części. Po pierwsze, dlaczego tak się dzieje? Po drugie, co mogę z tym zrobić? To znaczy, w jaki sposób mogę dodać wartość tylko do jednej listy?

Wyobrażam sobie, że podczas tworzenia słownika, wszystkie listy zostały oznaczone na tym samym obiekcie. Ale nie rozumiem, jak to możliwe, ponieważ po wprowadzeniu 0 zamiast [] w tworzeniu słownika, a następnie dodaniu wartości zamiast ich dodania, wartości zachowują się inaczej, jakby wskazywały na różne obiekty.

Byłbym wdzięczny za wszelkie dane wejściowe. Z góry dziękuję!

Odpowiedz

18

dict.fromkeys używa sam obiekt dla wszystkich wartości, w tym przypadku wykaz mutable ... Oznacza to, że wszystkie klucze dzielić ta sama lista pusta ... Podczas próby .append do wartości jednej listy , zmiany są wprowadzane w miejscu do obiektu, więc zmiany w nim są widoczne dla wszystkich, którzy go odwołują.

Jeśli zamiast tego stosować dict-Comp, np: {k:[] for k in ['could', 'we', 'be']} każdy [] jest inna lista pusta i tak byłby unikalny dla każdej wartości klucza i pracy zgodnie z oczekiwaniami.

W odniesieniu do korzystania dict.fromkeys(['a', 'b', 'c'], 0)0 jest niezmienne obiekt zatem nie podlega tej Gotcha jak zmiany to doprowadzić do nowych obiektów, a nie zmiana bazowego obiektu, który różnymi nazwami (w tym przypadku - wartości różnych kluczy) mogą się dzielić.

Powiązane problemy