2016-04-07 14 views
-1

私は以下のコードを持っています。 出力は非常に奇妙です。私はそれが間違って起こっている辞書がPythonで更新されないのはなぜですか?

{'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'}]]} 

を探していた通りであり

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 

出力は{'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'}]]} として来ていますか?

+1

コードの「修正」は 'k =" "= copy.deepcopy(w)'を 'w = copy.deepcopy(w);に置き換えています。 k ["a"] = w'ですが、より良い解決策は、viraptorのようにリストの理解に再構成することです – zehnpaard

答えて

1

あなたは、必要ではない多くのことをしているようです。一時的な辞書とディープコピーを消去する必要はありません。ここでは簡単な解決策です:あなたのコード内の問題については

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

- あなたがwsman_invoke_attr.clear()を行うときに、あなたはまだあなたが以前に使用した辞書への参照を保持しているので、あなたは、同時にそれらのすべてをクリアしています。次に、それらのすべてに新しい名前を追加します。

関連する問題