Python中while→else→while嵌套结构未触发外层终止报IndexError问题
问题根因
- 外层
while k>j的判断仅会在每次外层循环启动时执行一次,你在内层嵌套的while中修改k、j的值时,不会触发外层的判断校验,所以即使k已经小于等于j,内层循环仍会继续执行。 - 内层while循环没有增加边界校验逻辑,仅判断了数组元素相等的条件,当k不断减小到0后,仍会执行
nums[k-1]访问索引为-1的元素,直接触发越界错误,你提供的运行日志中k已经降到-2也验证了这点。
解决方案
在内层while的判断条件中优先增加边界校验,确保数组索引不会超出合法范围:
- 处理k的内层循环增加
k>j的前置判断,保证k不会降到小于等于j,同时避免k-1为负数 - 处理j的内层循环增加
j<k的前置判断,保证j不会升到大于等于k,同时避免j+1超出数组最大索引
修改后的完整代码如下:
nums=[0,0,0] i=0 j=i+1 k=len(nums)-1 while(k>j): s=nums[i]+nums[j]+nums[k] #greater than 0 if s>0: # 注意:原代码此处如果没有修改k/j的逻辑,遇到s>0的场景会触发死循环,请补充对应业务逻辑 k -= 1 else: #do something # 增加k>j的边界判断 while k>j and nums[k]==nums[k-1]: print("2nd while ",k,j) k-=1 k-=1 # 增加j<k的边界判断 while j<k and nums[j]==nums[j+1]: j+=1 j+=1
内容的提问来源于stack exchange,提问作者Prathmesh Deshmukh
相关产品推荐
相关产品推荐

