for循环列表忽略第二个元素?

时间:2016-04-01 17:39:25

标签: python

我有一个非常奇怪的错误,我无法看到出错的地方。我想循环一个对象列表

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原理吗? 谢谢 卡尔

1 个答案:

答案 0 :(得分:4)

不要修改在循环内迭代的容器。由于pop操作,容器会发生变化,因此迭代它会失败(跳过一个元素)。

如果你只想迭代收集并在最后销毁它 - 从它弹出直到它不是空的

EXAMPLE:
    insert into Event 
        (name, ratingOutOf10, numberOfRatings, category, venue, fromDateTime, description, pricesList, termsAndConditions)
        VALUES
        ('Disco', '3.4', '45', 'Adventure; Music;', 'Bombay Hall', strftime('%s','2016-01-27 20:30:50'), 'A dance party', 'Normal: Rs. 50', 'Items lost will not be the concern of the venue host.');


    insert into Event 
        (name, ratingOutOf10, numberOfRatings, category, venue, fromDateTime, description, pricesList, termsAndConditions)
        VALUES
        ('Trekking', '4.1', '100', 'Outdoors;', 'Sanjay Gandhi National Park', strftime('%s','2016-01-27 08:30'), 'A trek through the wilderness', 'Normal: Rs. 0', 'You must be 18 or more and sign a release.');


    select * from event where fromDateTime > strftime('%s','2016-01-27 20:30:49');

给出

a = range(10)

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

正如所料。

因此在你的情况下

0
1
2
3
4
5
6
7
8
9