Python 列表索引超出范围错误

0 投票
3 回答
2810 浏览
提问于 2025-04-29 08:12

我被分配了一个任务,要为一个学校项目制作一个测验应用。这个应用的功能是询问用户想要多少道题目,然后让他们输入所有的题目和答案。完成后,其他人就可以来参加这个测试。

现在的问题是,我在results函数里遇到了一个IndexError错误。这个函数的作用是将测试的答案和用户的答案进行比较,并打印出分数。

def results(testAnswers, userAnswers):
    score = 0
    for i in range(0, len(answers)):
        if testAnswers[i].lower().strip() == userAnswers[i].lower().strip():
            score += 1

    print("\nResults: You got " + str(score) + " out of " + str(len(answers)) + "!")

有没有人知道我该如何解决这个问题?

暂无标签

3 个回答

0

由于某种未知的原因,testAnswers和userAnswers的长度不一致。这里的教训是,始终要确保它们的长度是相同的。

一个简单的if语句就可以避免整个错误的发生。

if len(answers) != len(userAnswers):
    return
0

可能是你把代码复制到这个网站时出了点问题,不管怎样,这里的代码格式不对,导致很难看懂。

不过很明显,你在访问一个列表时,试图访问一个不存在的地方。为了帮助你找到这个错误,在你开始 while 循环后加上这一行:

print 'n %s, times %s, user_answers %s, answer_list %s' % (n, times, user_answers, answer_list)

然后运行程序,把程序的输出结果粘贴到你的问题里(但请先修正缩进)

3

你的问题出在这里:

while n < times:
    if user_answers[n] == answer_list[n]:
        score += 1
        n += 1
    if user_answers[n] != answer_list[n]:
        n += 1

假设 times 是 10,n 是 9,这样代码就会执行,然后 n+=1 让 n 变成 10。很可能,你的数组里有 10 个元素(这里的 10 只是个例子),这时 user_answers[10] 就会出错,因为有效的索引范围是 0..9

要解决这个问题,可以使用 elif

while n < times:
    if user_answers[n] == answer_list[n]:
        score += 1
        n += 1
    elif user_answers[n] != answer_list[n]:
        n += 1

另一种方法是完全去掉 else 这个部分。

while n < times:
    if user_answers[n] == answer_list[n]:
        score += 1
    n += 1

注意,代码中有很多地方可以优化,但我就先把答案放在这里,其他的你可以自己去探索。

撰写回答