2014-02-11 3 views
1

У меня есть получателей запроса, содержащий два получателей с ID 1 и 2: I цикла по каждому из них построить выход JSon:Значение списка Python перезаписывается, почему?

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 1 и recipient_id 2 Однако мой цикл перезаписывает значение, почему?

+1

изменения в data.append ({ 'recepient_id': item.pk}) .. нет необходимости в this_tem .. или define this_tem внутри цикла – Crazyshezy

ответ

5

this_tem - ссылка на один объект (диктофон), который вы неоднократно изменяете и добавляете в свой цикл. Вы перезаписываете значение этого ключа в цикле.

Вам нужно создать новый Dict каждой итерации:

data = [] 

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

Редактировать
Как Grijesh Чаухан любезно указал, выражение и цикл может быть упрощена визави соперничают список понимание:

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

wow быстрый ответ! Понимаю. – Prometheus

+2

или просто 'data.append ({'recipient_id': item.pk})' или использовать LC –

+1

@GrijeshChauhan, почему бы и нет !?^_^ – StoryTeller

3

Вы добавляете словарь, который является изменяемым объектом.

Итак, после вашей петли data содержит две ссылки на один и тот же словарь. Вам нужно будет добавить новые словари на каждой итерации, например. как это:

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

, который лучше dict (или data.append (this_tem)? – Prometheus

+1

С текущим dict (имея только один ключ), я предпочитаю 'append (dict (..))' версию - просто потому, что он избегает необходимости для другой переменной и сохраняет одну или две строки кода.Но это в основном вопрос вкуса, который я бы сказал. – sebastian

1

Это потому, что this_tem объявлена ​​снаружи для цикла

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') 
+2

Объявление наружу не является фактической причиной, почему это происходит.Пожалуйста, проверьте другие ответы. – thefourtheye

+1

при объявлении this_tem вне цикла, он изменяется и добавляется в цикл – Sar009

Смежные вопросы