2016-05-15 7 views
0

I Liste von djangoDas Verhalten von Wörterbuch und Liste

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

und wenn ich für Schleife verwenden Objekte zu setzen Show Wörterbuch und Liste

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

und Ergebnisliste:

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

jedes Wörterbuch alle gleich in der Liste

aber dieser Code funktioniert für das, was ich will:

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

und Ergebnis ist:

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

so die Frage ist, was im Wörterbuch passiert? Ich verstehe dieses Verhalten nicht ...

Antwort

1

Das Schlüsselproblem ist, wo Sie das b Wörterbuch definiert haben. Sie haben es vor der Schleife gemacht, aber brauchte es im Inneren zu tun:

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

Oder mit einem Liste Verständnis:

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

also, wenn Wörterbuch außerhalb der Schleife ist, b Wörterbuch ersetzen Originalwörterbuch, und wenn in der Schleife wird neue b-Wörterbuch erstellen, so dass die Liste nicht das gleiche Wörterbuch sein wird? –

+0

@martinwang yeah, Sie modifizieren das gleiche Wörterbuch immer und immer wieder, wenn Sie es außerhalb der Schleife definieren. Vielen Dank. – alecxe

+0

Danke, jetzt verstehe ich es –

Verwandte Themen