Python for循环跳过项

Python for循环跳过项,python,python-2.7,Python,Python 2.7,所以我有这个代码: animals = ['cat', 'dog', 'waffle', 'giraffe', 'turtle'] breakfeast_foods = ['waffle', 'pancake', 'eggs'] for index, item in enumerate(animals): print item if item in breakfeast_foods: animals.pop(index) 出于某种原因,loop print语句没

所以我有这个代码:

animals = ['cat', 'dog', 'waffle', 'giraffe', 'turtle']
breakfeast_foods = ['waffle', 'pancake', 'eggs']
for index, item in enumerate(animals):
    print item
    if item in breakfeast_foods:
        animals.pop(index)

出于某种原因,loop print语句没有打印“giraffe”。我不知道为什么,我遗漏了什么吗?

首先,它实际上是早餐而不是早餐。你打破(结束)的是快餐(不吃东西),而不是盛宴(吃很多食物)

但这只是我的学究作风:-)


现在,进入实际问题。您不应该在枚举列表时对其进行修改(从技术上讲,您可以这样做,但您将得到您所看到的奇怪结果)

这样做会弄乱用于枚举的内部结构。这是一个简化的解释(a),但应说明以下概念:

可以将枚举想象为使用索引单步遍历
animals
中的每个元素

当你到达索引2(华夫饼)时,你发现它在
早餐食品中
,你删除了该索引处的项目,并将其他项目混在一起,这样你现在就有了:

['cat', 'dog', 'giraffe', 'turtle']
然后枚举移到索引3(现在是海龟)并打印出来,在这个过程中跳过长颈鹿

在任何情况下,也许一种更具Python风格的方法是:

animals = [x for x in animals if x not in breakfast_foods]


(a) Python的特定实现是否使用简单数组或其他数据结构在这里并不重要。这一解释只是为了说明,在对数据结构进行迭代时更改数据结构通常会导致奇怪的情况。

首先,它实际上是早餐而不是早餐。你打破(结束)的是快餐(不吃东西),而不是盛宴(吃很多食物)

但这只是我的学究作风:-)


现在,进入实际问题。您不应该在枚举列表时对其进行修改(从技术上讲,您可以这样做,但您将得到您所看到的奇怪结果)

这样做会弄乱用于枚举的内部结构。这是一个简化的解释(a),但应说明以下概念:

可以将枚举想象为使用索引单步遍历
animals
中的每个元素

当你到达索引2(华夫饼)时,你发现它在
早餐食品中
,你删除了该索引处的项目,并将其他项目混在一起,这样你现在就有了:

['cat', 'dog', 'giraffe', 'turtle']
然后枚举移到索引3(现在是海龟)并打印出来,在这个过程中跳过长颈鹿

在任何情况下,也许一种更具Python风格的方法是:

animals = [x for x in animals if x not in breakfast_foods]


(a) Python的特定实现是否使用简单数组或其他数据结构在这里并不重要。这一解释只是为了说明,在对数据结构进行迭代时更改数据结构通常会导致奇怪的情况。

这是家庭作业吗?如果项目不在…中,
有一个更好的方法,它可能是用于其他人的作业,但不是用于我的作业。有人问我怎么做(从列表中删除某些项目),这是我的回答。但在我更仔细地检查了代码之后,我发现了这个奇怪的地方,所以我决定问为什么会这样。这是家庭作业吗?如果项目不在…
中,
有一个更好的方法,它可能是用于其他人的作业,但不是用于我的作业。有人问我怎么做(从列表中删除某些项目),这是我的回答。但是在我更仔细地检查了代码之后,我发现了这个奇怪的地方,所以我决定问为什么会发生。在Python解释中使用指针是没有帮助的。@Steven,你看过CPython代码库吗?:-)无论如何,我会听从你的判断,使用一个不同的术语。不然怎么解释呢,@Steven?我明白了,所以当我使用.pop(index)删除“华夫格”时,它将“giraffe”移到了“华夫格”所在的位置,因为循环还在运行,Python解释器认为它已经在“giraffe”上迭代了?@Jeremy,是的,基本上就是这样。在Python解释中使用指针是没有帮助的。@Steven,你看过CPython代码库吗?:-)无论如何,我会听从你的判断,使用一个不同的术语。不然怎么解释呢,@Steven?我明白了,所以当我使用.pop(index)删除“华夫格”时,它将“giraffe”移到了“华夫格”所在的位置,因为循环还在运行,Python解释器认为它已经在“giraffe”上迭代了?@Jeremy,是的,基本上就是这样。