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

Python中while循环比较时触发IndexError的原因咨询

问题:IndexError触发逻辑困惑

我了解Python中的IndexError,但搞不懂这段代码触发错误的逻辑。明明while循环里用的是已经存在的列表,却抛出了这个错误,而且print能正常访问同一索引,循环条件里就不行。

我的代码

def solve(A, B):
    cumsum = [A[0]] * len(A)
    for i in range(1,len(A)):
        cumsum[i] = cumsum[i-1] + A[i]
    final_arr = []
    for val in B:
        index = 0
        print(index, cumsum)
        print("INDEX Value:", cumsum[index])
        print(val)
        while (cumsum[index] <= val):
            index+=1
        final_arr.append(index)
    return final_arr

A = [3, 4, 4, 6] 
B = [20, 4, 10, 2]
print(solve(A,B))

在线编译器输出

0 [3, 7, 11, 17]
INDEX Value: 3
20
Traceback (most recent call last):
  File "<string>", line 23, in <module>
File "<string>", line 14, in solve
IndexError: list index out of range

问题分析

问题出在while循环的执行逻辑:当val(比如第一个B元素20)大于cumsum的最后一个元素(17)时,循环会持续执行index+=1,直到index的值变成4。而cumsum的长度是4,合法索引范围是0-3,此时访问cumsum[index]就会触发索引越界错误。

你看到print能正常访问是因为初始index是0,还没进入循环累加;但循环会不断增加index,直到超出列表的索引范围,这时候再判断cumsum[index] <= val就会报错。

解决方法

在while循环的条件里增加索引范围判断,确保index不会超出列表长度:

def solve(A, B):
    cumsum = [A[0]] * len(A)
    for i in range(1,len(A)):
        cumsum[i] = cumsum[i-1] + A[i]
    final_arr = []
    for val in B:
        index = 0
        print(index, cumsum)
        print("INDEX Value:", cumsum[index])
        print(val)
        # 增加index < len(cumsum)的判断
        while index < len(cumsum) and cumsum[index] <= val:
            index+=1
        final_arr.append(index)
    return final_arr

A = [3, 4, 4, 6] 
B = [20, 4, 10, 2]
print(solve(A,B))

修改后,当index到达列表长度时,循环停止,此时index的值等于列表长度,符合需求(所有累加元素都小于等于val时,应该返回列表长度作为结果)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:45:22