2016-05-15 60 views
0

我有Django的字典和列表的

>>> post = Post.objects.all() 
>>> post 
[<Post: one>, <Post: two>, <Post: three>, <Post: four>] 

列表,當我用for循環把對象字典和列表

>>> a = [] 
>>> b = {} 
>>> for p in post: 
... b[post.pub_date.year] = post.pub_date.month 
... a.append(b) 

和結果列表顯示的行爲:

>>> a 
[{2016: 4, 2015: 8}, {2016: 4, 2015: 8}, {2016: 4, 2015: 8}, {2016: 4, 2015: 
8}] 

每個字典都在列表中相同

但是這個代碼會爲我想要的工作:

>>> for p in post: 
... a.append({p.pub_date.year:p.pub_date.month}) 

和結果是:

>>> a 
[{2016: 5}, {2016: 4}, {2015: 10}, {2015: 8}] 

所以問題是正在發生的事情的字典嗎? 我不明白這個行爲...

回答

1

關鍵問題是你在哪裏定義了b字典。你已經在循環之前進行,但這樣做內需的:

for p in post: 
    b = {} 
    b[p.pub_date.year] = p.pub_date.month 
    a.append(b) 

或者,用列表理解

a = [{p.pub_date.year: p.pub_date.month} for p in post] 
+1

所以如果詞典是外循環,B字典將取代原始字典,如果在循環中將創建新的B字典,所以列表將不會是相同的字典? –

+0

@martinwang是的,如果你在循環之外定義它,你基本上一次又一次地修改相同的字典。謝謝。 – alecxe

+0

謝謝,現在我明白了 –