2011-08-03 62 views
0

我遇到了一個奇怪的問題,在我的django應用程序中,for循環跳過了其他所有項目。我有一個返回的查詢集和list() ed迭代。這樣做的關鍵是刪除另一個列表中通過POST變量傳遞給視圖的項目。該視圖是ajax請求,並返回需要推送到頁面的JSON項目列表。在下一次請求時,頁面會傳遞頁面上已有對象的ID列表,因此我可以從查詢集中移除這些對象,並僅傳回新對象。我在代碼的問題部分放了幾個打印語句,並發現在頁面的第一個請求上,列表因爲沒有顯示而進入空白頁面。查詢運行並返回所有結果,然後顯示在頁面上。在第二個請求中,列表進入帶有所有id的頁面,這就是問題發生的地方:當我遍歷查詢集,檢查id是否在列表中時,它只遍歷奇數值(被刪除)並返回偶數id對象的列表,以在頁面上第二次顯示。Python循環跳過其他每個值

代碼:

items = list(listobj.getItems()) 
temp = items 
print "Item List: ", temp 
print "Rendered List: ", request.POST['rendered'].split(',') 
for item in temp: 
    print "Item ID: ", str(item.id) 
    print "Rendered List: ", request.POST['rendered'].split(',') 
    if str(item.id) in request.POST['rendered'].split(','): 
     items.remove(item) 
     print "Removed Item: ", item.id 
print "Unrendered Items: ", [item.id for item in items] 

結果:

[02/Aug/2011 20:17:25] "GET /list/list HTTP/1.1" 200 6256 
Item List: [<Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>] 
Rendered List: [u''] 
Item ID: 1 
Rendered List: [u''] 
Item ID: 2 
Rendered List: [u''] 
Item ID: 3 
Rendered List: [u''] 
Item ID: 4 
Rendered List: [u''] 
Item ID: 5 
Rendered List: [u''] 
Item ID: 6 
Rendered List: [u''] 
Item ID: 7 
Rendered List: [u''] 
Item ID: 8 
Rendered List: [u''] 
Item ID: 9 
Rendered List: [u''] 
Unrendered Items: [1, 2, 3, 4, 5, 6, 7, 8, 9] 
[02/Aug/2011 20:17:25] "POST /items/ HTTP/1.1" 200 528 
Item List: [<Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>] 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Item ID: 1 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 1 
Item ID: 3 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 3 
Item ID: 5 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 5 
Item ID: 7 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 7 
Item ID: 9 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 9 
Unrendered Items: [2, 4, 6, 8] 
[02/Aug/2011 20:17:55] "POST /items/ HTTP/1.1" 200 252 

回答

5

tempitems指向同一個對象,所以當你做items.remove()你還修改temp。您可能想要執行temp = items[:]以複製items列表的值。

+0

+1,良好的漁獲,沒有拿到海報的意圖在頭兩行。 ('temp = list(items)'可能更習慣性)。 – GaretJax

1

您不應該在迭代它時修改數據結構。

不管怎麼說,這是一個更簡潔,高性能的代碼來執行你的操作:

​​
+0

假設當前的打印語句都只是用於調試,是的。 –