为什么for循环中的if判断无法删除列表全部奇数,仅每隔一个删除?
问题根因
- 直接在遍历原列表的过程中删除列表元素,会导致迭代索引错位,这是漏删的核心原因。
- Python的for循环遍历列表时是按索引顺序依次取值:
- 当你删除当前索引位置的奇数后,列表中该位置之后的所有元素都会自动向前移动1位填充空缺
- 下一轮循环会自动读取下一个索引位置的元素,刚好跳过了刚移动到当前索引位置的元素,最终表现为每隔一个奇数就漏删一个
- 简单复现示例:初始列表为
[1,3,5,7],第一次删除索引0的1后,列表变为[3,5,7],下一轮循环直接读索引1的5,索引0的3就被直接跳过漏删。
修复方案
两种常用的无Bug写法:
# 方案1:遍历原列表的拷贝,修改原列表 fib_list = [1, 2] while fib_list[-1]+fib_list[-2] <= 4000000: fib_list.append(fib_list[-1] + fib_list[-2]) # 用fib_list[:]生成浅拷贝,遍历拷贝不会受原列表修改影响 for i in fib_list[:]: if i % 2 == 1: print(i) fib_list.remove(i) print(fib_list) print(sum(fib_list)) # 方案2:用列表推导式直接生成过滤后的新列表(代码更简洁,性能更高) fib_list = [1, 2] while fib_list[-1]+fib_list[-2] <= 4000000: fib_list.append(fib_list[-1] + fib_list[-2]) fib_list = [i for i in fib_list if i % 2 == 0] print(fib_list) print(sum(fib_list))
额外提示:原代码中用
list作为变量名会覆盖Python内置的list构造函数,属于不规范的命名习惯,建议更换为更语义化的变量名,比如fib_list。
内容的提问来源于stack exchange,提问作者Nakiro
相关产品推荐
相关产品推荐

