You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么for循环中的if判断无法删除列表全部奇数,仅每隔一个删除?

问题根因
  • 直接在遍历原列表的过程中删除列表元素,会导致迭代索引错位,这是漏删的核心原因。
  • Python的for循环遍历列表时是按索引顺序依次取值:
    1. 当你删除当前索引位置的奇数后,列表中该位置之后的所有元素都会自动向前移动1位填充空缺
    2. 下一轮循环会自动读取下一个索引位置的元素,刚好跳过了刚移动到当前索引位置的元素,最终表现为每隔一个奇数就漏删一个
  • 简单复现示例:初始列表为[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:03