Python for 循环跳过项目

Jer*_*cer 0 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)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,循环打印语句不会打印“长颈鹿”。我不知道为什么,是我缺少什么吗?

pax*_*blo 5

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

但这只是我的迂腐:-)


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

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

将枚举视为在animals使用索引时逐步遍历每个元素。

当您到达索引 2(华夫饼)并且发现它位于 中时breakfast_foods,您可以删除该索引处的项目并将其他项目打乱,这样您现在就拥有了:

['cat', 'dog', 'giraffe', 'turtle']
Run Code Online (Sandbox Code Playgroud)

然后枚举移至索引 3(现在是海龟)并将其打印出来,在此过程中跳过长颈鹿。

无论如何,也许一种更 Pythonic 的方法是:

animals = [x for x in animals if x not in breakfast_foods]
Run Code Online (Sandbox Code Playgroud)

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

  • -1。在 Python 解释中提出指针没有帮助。 (2认同)
  • 还能怎么解释,@Steven? (2认同)
  • 我明白了,所以当我使用 .pop(index) 删除 'waffle' 时,它将 'giraffe' 移到了 'waffle' 所在的位置,并且由于循环仍在运行,Python 解释器认为它已经迭代了 '长颈鹿'? (2认同)