两段逻辑相似的Python代码为何一段触发IndexError?
两段removeDuplicates代码的差异原因解析
问题描述
两段实现removeDuplicates方法的Python代码逻辑看似一致,但运行结果不同:
- 第一段代码可正常运行:
class Solution: def removeDuplicates(self, nums: List[int]) -> int: i = 1 while i < len(nums)-1: if nums[i]==nums[i-1] and nums[i]==nums[i+1]: del nums[i] else: i+=1 return len(nums)
- 第二段代码抛出索引越界错误:
IndexError: list index out of range
if nums[i]==nums[i-1] and nums[i]==nums[i+1]:
第二段代码如下:
class Solution: def removeDuplicates(self, nums: List[int]) -> int: n = len(nums)-1 i = 1 while i < n: if nums[i]==nums[i-1] and nums[i]==nums[i+1]: del nums[i] else: i+=1 return len(nums)
两者核心差异:第一段在while循环条件中直接使用len(nums)-1,第二段则提前将初始的len(nums)-1存入变量n,用i < n作为循环判断条件。
报错原因
问题出在列表长度的动态变化上:
- 第一段代码的循环条件
i < len(nums)-1会在每次循环开始时重新计算当前列表的长度。当删除nums中的元素后,列表长度立刻缩短,len(nums)-1也随之变小,确保i永远不会超出当前列表的有效索引范围,自然不会出现nums[i+1]越界的情况。 - 第二段代码的
n是在函数开头就计算好的初始长度减一,这个值固定不变。当删除元素后,列表实际长度已经变短,但n还是原来的数值。比如初始列表长度为5,n=4;删除一个元素后列表长度变为4,此时如果i走到3,满足i < n(3<4),但nums[i+1]就是nums[4],而当前列表的最大索引是3,直接触发索引越界错误。
内容的提问来源于stack exchange,提问作者Sourav Biswal
相关产品推荐
相关产品推荐

