2016-04-01 9 views
3

私は非常に奇妙なバグがあり、どこが間違っているのか分かりません。私は、オブジェクトは2番目の要素を無視しますか?

のリスト
objects = [<object 1>, <object 2>, <object 3>, <object 4>, <Query_Category 5>, <object 6>] 

をループにしたいと私はシンプル

for i, object in enumerate(objects): 
    print "delete ", object 
    objects.pop(i) 

を行うと、出力はそのループは第二の要素を無視

delete <Query_Category 1> 
delete <Query_Category 3> 
delete <Query_Category 4> 
delete <Query_Category 5> 
delete <Query_Category 6> 

のですか?この結果は再現性があります。つまり、再度実行すると同じ結果につながります。 これは私のコードで何か変なことが原因だと思うので、おそらく再現性がありません。しかし、私は何を探すべきか分かりません。 ここに足りない基本的なpythonの原理がありますか? ありがとう carl

+3

はほとんどない良いアイデアではありません。あなたはこれで何を達成しようとしていますか? –

答えて

4

ループ内で反復処理しているコンテナを変更しないでください。ポップ操作のためにコンテナが変更され、その反復処理が失敗します(要素をスキップします)。

あなただけのコレクションを反復処理し、最後にそれを破壊したい場合

- それは

a = range(10) 

while len(a): 
    print a.pop(0) 

空ではないまで、それからポップは予想通り

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

を与えます。あなたが反復処理しているオブジェクトを変更するあなたのケースではこのように

while len(objects): 
    object = objects.pop(0) 
    print "delete ", object 
関連する問題