2016-04-28 7 views
2

Ich bin gerade von einem Gotcha bekommen. Dieser Code dient als man erwarten würde:Warum aktualisiert ein Wörterbuch mit Tuple-Keys, die mit zip gestartet wurden, alle Keys nach der Aktualisierung eines einzelnen Keys?

keys = range(8) 

DICT={} 
for k in keys: 
    DICT[k] = [] 
print DICT 
#returns 
#{0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} 

DICT[1].append('mkay') 
print DICT 
#returns 
#{0: [], 1: ['mkay'], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} 

Aber wenn ich das Wörterbuch anders zu initialisieren, ist das Anfügen Verhalten ganz anders:

DICT = dict(zip(keys,[[]]*len(keys))) 
print DICT 
#returns 
#{0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} 

So ist es gleich aussieht. Aber es ist nicht:

DICT[1].append('mkay') 
print DICT 
#returns 
#{0: ['mkay'], 1: ['mkay'], 2: ['mkay'], 3: ['mkay'], 4: ['mkay'], 5: ['mkay'], 6: ['mkay'], 7: ['mkay']} 

Weiß jemand, was hier vor sich geht? Ich dachte, ich würde dies auch für irgendjemanden veröffentlichen, der sich damit befassen könnte.

+1

Nichts geheimnisvoll. Durch Multiplizieren von '[[]]' mit 'len (keys)' haben Sie eine Liste von Listen erstellt, die alle auf dasselbe Objekt zeigen. – Kasramvd

+1

Siehe http://stackoverflow.com/a/36452923/2201041 für eine Antwort, die es mir deutlicher gemacht hat. – JETM

Antwort

1

Jeder Wert im Wörterbuch bezieht sich auf die gleiche Liste, da [[]]*len(keys). Das heißt "Erstellen Sie eine Liste, und kopieren Sie den Verweis len(keys) Mal".

+0

Ich verstehe. So gehen 'len (keys)' Zeiger auf dieselbe Liste. Ich nahm an, es hat nur 'len (keys)' verschiedene Listen gemacht! – Wapiti