【问题标题】:Python for-loop deletion stops halfwayPython for 循环删除中途停止
【发布时间】:2026-01-21 08:00:01
【问题描述】:

今天刚开始学习 Python。我很喜欢它,文档就像人们所说的那样有帮助。但很明显,我对 Python 的两个特性没有了解:那些列表和那些 for 循环。

这段代码的结果:

lets = ['a','b','c','d','e','f','g','h','i','j']

for j in lets:
    del lets[0]
    print(lets)

这是:

['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
['d', 'e', 'f', 'g', 'h', 'i', 'j']
['e', 'f', 'g', 'h', 'i', 'j']
['f', 'g', 'h', 'i', 'j']

为什么它在五步而不是十步处停止(因此删除所有项目)?

【问题讨论】:

  • 嗯,你正在迭代一个列表,当你迭代它时你正在删除它。好像你不想那样做。

标签: python list for-loop


【解决方案1】:

您在迭代集合时正在修改它。这是一个巨大的危险信号 - 永远不要这样做。

如果您想修复上述代码,请遍历lets副本

for j in lets[:]:
    del lets[0]

或其他与lets 长度相同的对象,例如range(len(lets))

我要指出的是,上面用lets.clear()做的更简单

【讨论】:

  • lets.clear() 是有道理的。这只是简化的简化;最初的目标与从列表中删除所有内容无关。 (当我只想删除单个项目但将指令放入 for 查找时,我实际上是偶然遇到的,然后我想“等一下,我不会想到这种行为......)
【解决方案2】:

据我所知,lets 中有十个元素。您的循环在五点停止。删除五个元素后,您还剩下五个元素。在第五次循环之后,它检查lets 中有多少元素,看到五个,然后停止,因为它已经循环了五次。

【讨论】:

  • 好的,所以类似的畸形循环可能会导致两者在正中间以外的地方相遇。我想我明白了。