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

时间:2014-02-11 12:59:29

标签: 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')

这给了我:

[
    {
        "recipient_id": 2,
    },
    {
        "recipient_id": 2,
    }
]

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

3 个答案:

答案 0 :(得分:5)

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

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

data = []

for item in recipients:
    this_tem = {}
    this_tem['recipient_id'] = item.pk
    data.append(this_tem)

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

data = [{'recipient_id': item.pk} for item in recipients]

答案 1 :(得分:3)

你要附加一个字典,这是一个可变对象。

因此在循环之后,data包含对同一字典的两个引用。 您必须在每次迭代中添加新词典,例如像这样:

for item in recipients:
    data.append(dict(recipient_id = item.pk))

答案 2 :(得分:1)

这是因为this_tem在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')