Python列表值被覆盖,为什么?
我有一个收件人查询,其中包含两个ID分别为1和2的收件人: 我在每一个上循环以构建json输出:Python列表值被覆盖,为什么?,python,django,Python,Django,我有一个收件人查询,其中包含两个ID分别为1和2的收件人: 我在每一个上循环以构建json输出: data = [] this_tem = {} for item in recipients: this_tem['recipient_id'] = item.pk data.append(this_tem) return HttpResponse(json.dumps(data), mimetype='application/js
data = []
this_tem = {}
for item in recipients:
this_tem['recipient_id'] = item.pk
data.append(this_tem)
return HttpResponse(json.dumps(data), mimetype='application/json')
这给了我:
[
{
"recipient_id": 2,
},
{
"recipient_id": 2,
}
]
正如您所看到的,它应该是
recipient\u id 1
和recipient\u id 2
但是,我的循环会覆盖该值,为什么?此项是对单个对象(dict)的引用,您可以在循环中重复修改并附加该对象。覆盖循环中该键的值
您需要在每次迭代中创建一个新的dict:
data = []
for item in recipients:
this_tem = {}
this_tem['recipient_id'] = item.pk
data.append(this_tem)
编辑
正如Grijesh Chauhan优雅地指出的那样,表达式和循环可以通过vie a list理解来简化:
data = [{'recipient_id': item.pk} for item in recipients]
您正在附加一个字典,它是一个可变对象
因此,在循环之后,数据
包含对同一字典的两个引用。
您必须在每次迭代中添加新词典,例如:
for item in recipients:
data.append(dict(recipient_id = item.pk))
这是因为该项是在for循环外部声明的
data = []
for item in recipients:
this_tem = {}
this_tem['recipient_id'] = item.pk
data.append(this_tem)
return HttpResponse(json.dumps(data), mimetype='application/json')
更改为data.append({'recepient_id':item.pk})。。不需要这个项目。。或者在循环中定义此项。声明外部不是发生此情况的实际原因。请检查其他答案。当在循环外声明此项时,它将被修改并附加到循环中哪个更好dict(或data.append(此项)?对于当前dict(只有一个键),我更喜欢append(dict(…)
version-仅仅因为它避免了对另一个变量的需要并保存了一两行代码。但我认为这基本上是一个品味问题。或者只是data.append({'recipient\u id':item.pk})
或者使用LC@GrijeshChauhan,为什么不能两者兼而有之^_^