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

Python删除列表起始偶数函数异常问题排查

列表删除逻辑问题解析

问题现象

需求为反复删除列表首元素,直到遇到奇数或列表为空。自定义函数测试出现两个异常:

  • 调用 delete_starting_evens([4,8,10]) 返回 [8],首元素8未被删除
  • 调用 delete_starting_evens([4,8,10,11,12,15]) 返回 [8,11,15],非首元素12被误删

自定义函数问题根源

Python中在遍历列表的同时修改列表会导致索引错位,这是核心问题。以下是两个测试用例的具体执行过程:

测试用例1:[4,8,10]

  1. 循环开始,迭代器指向列表第一个元素4,判定为偶数,执行lst.remove(4),列表变为[8,10]
  2. 迭代器自动递增索引,此时指向新列表的索引1(对应元素10),判定为偶数,执行lst.remove(10),列表变为[8]
  3. 迭代器索引超出新列表长度,循环结束。元素8始终没被迭代器指向,因此未被删除

测试用例2:[4,8,10,11,12,15]

  1. 迭代器指向第一个元素4,删除后列表变为[8,10,11,12,15]
  2. 迭代器索引递增,指向新列表的索引1(对应元素10),删除后列表变为[8,11,12,15]
  3. 迭代器索引继续递增,指向新列表的索引2(对应元素12),判定为偶数后执行删除,列表变为[8,11,15]
  4. 迭代器索引超出列表长度,循环结束。元素8未被迭代到,而本应保留的12因索引错位被误删,且迭代器从未指向11,因此没触发break逻辑

官方函数的正确逻辑

官方函数使用while循环,每次直接检查当前列表的第一个元素:

def delete_starting_evens(lst):
  while (len(lst) > 0 and lst[0] % 2 == 0):
    lst = lst[1:]
  return lst

每次通过切片lst[1:]生成新列表,始终保证处理的是当前列表的首元素,完全避免了遍历修改列表的索引错位问题,逻辑精准符合需求。

内容的提问来源于stack exchange,提问作者louthsome

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:30:52