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

Pro*_*eus 3 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/json')
Run Code Online (Sandbox Code Playgroud)

这给了我:

[
    {
        "recipient_id": 2,
    },
    {
        "recipient_id": 2,
    }
]
Run Code Online (Sandbox Code Playgroud)

你可以看到它应该是recipient_id 1,recipient_id 2然而,我的循环覆盖了值,为什么?

Sto*_*ica 6

this_tem是对您在循环中反复修改和追加的单个对象(dict)的引用.您在循环中覆盖该键的值.

您需要在每次迭代时创建一个新的dict:

data = []

for item in recipients:
    this_tem = {}
    this_tem['recipient_id'] = item.pk
    data.append(this_tem)
Run Code Online (Sandbox Code Playgroud)

编辑
正如Grijesh Chauhan慷慨地指出的那样,表达式和循环可以通过列表理解来简化:

data = [{'recipient_id': item.pk} for item in recipients]
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`data.append({'recipient_id':item.pk})`或使用LC (3认同)