2016-04-07 9 views
-1

Ich habe unter Code, Der Ausgang kommt sehr komisch.Warum wird mein Wörterbuch in Python nicht aktualisiert?

wsman_invoke_attr = {} 
l = [u'BIOS.Setup.1-1:Slot3', u'BIOS.Setup.1-1:Slot2', u'BIOS.Setup.1-1:Slot1', u'BIOS.Setup.1-1:Slot5', u'BIOS.Setup.1-1:Slot4'] 
w = [] 
k = {"a":w} 
for i in l: 
    wsman_invoke_attr["InstanceID"] = i 
    w.append([wsman_invoke_attr]) 
    k["a"] = copy.deepcopy(w) 

    wsman_invoke_attr.clear() 
print k 

Der Ausgang kommt als {'a': [[{'InstanceID': u'BIOS.Setup.1-1:Slot4'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot4'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot4'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot4'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot4'}]]} wo, wie ich für

{'a': [[{'InstanceID': u'BIOS.Setup.1-1:Slot3'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot4'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot2'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot5'}], [{'InstanceID': u'BIOS.Setup.1-1:Slot1'}]]} 

Wo ist es schief läuft suchen?

+1

Das "Fix" für den Code ersetzt 'k [" a "] = copy.deepcopy (w)' mit 'w = copy.deepcopy (w); k ["a"] = w ", aber die bessere Lösung ist die Umstrukturierung zu einem Listenverständnis nach Viraptor – zehnpaard

Antwort

1

Sie scheinen eine Menge Dinge zu tun, die nicht notwendig sind. Das Löschen des temporären Dictionary und decopy ist hier nicht notwendig. Hier ist eine einfachere Lösung:

instances = [[{'InstanceID': iid}] for iid in l] 
k = {'a': instances} 

Was das Problem in Ihrem Code - wenn Sie wsman_invoke_attr.clear() tun du bist immer noch einen Verweis auf das Wörterbuch halten, bevor Sie verwendet werden, so dass Sie alle von ihnen zugleich Clearing . Dann fügen Sie allen wieder einen neuen Namen hinzu.

Verwandte Themen