Python列表值被覆盖,为什么?

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

我有一个收件人查询,其中包含两个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/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,为什么不能两者兼而有之^_^