2014-02-11 100 views
1

我有一個收件人查詢包含兩個收件人與ID 1和2: 我遍歷每一個以建立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 1recipient_id 2但是,我的循環會覆蓋該值,爲什麼?

+1

變化data.append({ 'recepient_id':item.pk})..無需this_tem ..或在循環內定義this_tem – Crazyshezy

回答

5

this_tem是對單個對象(字典)的引用,您可以在循環中反覆修改和追加。您在循環中覆蓋該鍵的值。

你需要創建一個新的字典每次迭代:

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

快速響應!我懂了。 – 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

這是更好的字典(或data.append(this_tem)? – Prometheus

+1

隨着目前的字典(只有一個關鍵),我更喜歡'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