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]
- 循环开始,迭代器指向列表第一个元素
4,判定为偶数,执行lst.remove(4),列表变为[8,10] - 迭代器自动递增索引,此时指向新列表的索引1(对应元素
10),判定为偶数,执行lst.remove(10),列表变为[8] - 迭代器索引超出新列表长度,循环结束。元素
8始终没被迭代器指向,因此未被删除
测试用例2:[4,8,10,11,12,15]
- 迭代器指向第一个元素
4,删除后列表变为[8,10,11,12,15] - 迭代器索引递增,指向新列表的索引1(对应元素
10),删除后列表变为[8,11,12,15] - 迭代器索引继续递增,指向新列表的索引2(对应元素
12),判定为偶数后执行删除,列表变为[8,11,15] - 迭代器索引超出列表长度,循环结束。元素
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
相关产品推荐
相关产品推荐

