2011-08-03 9 views
0

forループが他のすべての項目をスキップしているdjangoアプリケーションで、私は奇妙な問題に遭遇しました。私は返されたクエリーセットをとり、list()を反復処理しました。これを行うことのポイントは、POST変数を介してビューに渡される別のリスト内の項目を削除することです。このビューはajaxリクエストで、ページにプッシュする必要がある項目のJSONリストを返します。次のリクエスト時に、ページはすでにページにあるオブジェクトのIDのリストを渡すので、クエリーセットからそれらを削除し、新しいクエリーセットだけを返すことができます。私はいくつかのprint文をコードの問題部分に置いて、ページからの最初のリクエストでは、表示されていないリストがページに空になることを理解しました。クエリが実行され、すべての結果がページに表示されます。 2番目のリクエストでは、リストはすべてのIDを持つページに入っています。これが問題の発生場所です。クエリーセットをループして、IDがリストにあるかどうかを調べると、奇数の値だけが反復されます(削除されます)、ページに2回目に表示される偶数IDオブジェクトのリストを返します。他のすべての値をスキップするPython for

コード:

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[:]とします。

+0

+1、良いキャッチ最初の二行にポスターの意図を取得していない、:

とにかく、これはあなたの操作を行うには、より簡潔でパフォーマンスのコードがあります。 ( 'temp = list(items)'はより慣用的かもしれません)。 – GaretJax

1

データ構造を反復処理している間は、データ構造を変更しないでください。

​​
+0

現在のprint文はすべてデバッグのためのものであると仮定します。 –

関連する問題