我需要将数据JSON附加到更大的JSON中的数据列表中,但我通过引用获得一个副本,但我需要一个按值复制,以下是我的代码:
dataJS = {}
dataJS['data'] = []
data = {}
for d in res:
data['ver'] = d[0]
data['exp'] = "{\"DT\": \"1344\", \"Vl\": 757}"
print("data : ", data )
dataJS['data'].append(data)
print("\n\n")
for i in dataJS['data']:
print("JsData : ", i)
print("\n\n")我的结果是:
data : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 1}
data : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 5}
data : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 6}
data : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 9}
data : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}
JsData : {'exp': '{"DT": "1344", "Vl": 757}', 'ver': 12}有什么帮助吗!谢谢
发布于 2017-09-05 18:40:40
问题是,您在循环之前创建了一个data字典,并不断覆盖它的值并将其附加到列表中。这里的关键点是,它是附加到列表中的同一个-在Python语言中,赋值永远不会创建对象的新副本dict (无论它是什么类型)。There's a very good article about this here和我强烈建议您花几分钟时间阅读它(并在python shell中进行实验),这样您就可以理解python的“变量”与最常见的C风格的变量有何不同。
在您的例子中,解决方案是显而易见的:在每次迭代中创建一个新的data字典,即:
dataJS = {'data': []}
for d in res:
data = {
'ver': d[0],
'exp': '{"DT": "1344", "Vl": 757}'
}
dataJS["data"].append(data)发布于 2017-09-05 18:20:19
我找到了答案:
使用复制值的函数:data.copy(),
dataJS[pat] = {}
dataJS[pat]['version'] = newVersion
dataJS[pat]['data'] = []
data = {}
for i, d in enumerate(res) :
data['type'] = d[2]
data['exp'] = d[3]
data['val'] = d[4]
print("\n\n")
print("d[4]",d[4])
print("\n\n")
dataJS[pat]['data'].append(data.copy())所以dataJS['data'].append(data.copy())运行得很好。
发布于 2017-09-05 18:18:36
默认情况下,Python会对对象进行浅层复制。有一个叫做copy的库可以帮助你。您需要调用的命令是copy.deepcopy(myVar),它将创建内容的副本,也就是deep copy (如您所料)
https://stackoverflow.com/questions/46052489
复制相似问题