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.
Nichts geheimnisvoll. Durch Multiplizieren von '[[]]' mit 'len (keys)' haben Sie eine Liste von Listen erstellt, die alle auf dasselbe Objekt zeigen. – Kasramvd
Siehe http://stackoverflow.com/a/36452923/2201041 für eine Antwort, die es mir deutlicher gemacht hat. – JETM