【问题标题】:Why am I getting a python list index error in this code?为什么我在此代码中收到 python 列表索引错误?
【发布时间】:2020-04-29 17:36:07
【问题描述】:

问题是: 给你一个清单。打印列表编号的总和。如果列表为空,则打印 0。此外,元素 7 和它旁边的元素不会对总和做出贡献。

def realSum(arr):
    if len(arr) == 0:
        return 0
    for i in range(len(arr)-1):
        if arr[i] == 7:
            del arr[i:i+2]
    return sum(arr)

为什么这段代码给我这个错误:

Traceback (most recent call last):
  File "C:/Users/welcome/PycharmProjects/ko/ko.py", line 16, in <module>
    print(realSum(arr))
  File "C:/Users/welcome/PycharmProjects/ko/ko.py", line 11, in realSum
    if arr[i] == 7:
IndexError: list index out of range

此代码在使用 while 循环时有效,但在使用 for 循环时无效。 为什么会这样?

【问题讨论】:

  • 请注意,range(len(arr)-1) 在循环开始之前执行一次。每次迭代都不会“检查”。
  • 不要修改你正在迭代的列表,你会有各种各样的副作用。
  • 等等,你只是想得到一个列表的总和?
  • @Carcigenicate 真的很抱歉,您能详细说明一下吗?
  • 每次调用del,列表都会变短,但您仍在迭代,直到i 成为arr 的原始长度。如果您删除任何元素,这将超出范围。

标签: python list error-handling


【解决方案1】:

range(len(arr)-1) 在循环开始迭代之前计算。现在,让我们输入以下内容:

arr = [7, 7, 7]

因此您的循环将遍历以下is - 0,1:

  • 在第一次迭代中,i=0arr 的前 2 个元素将被删除,因此 arr 中将只有一个元素
  • 在第二次迭代中,i=1arr[i] 将引发 IndexError 异常,因为您正在尝试访问大小为 1 的列表的第二个元素。

这是一个经典示例,说明了为什么对正在迭代的列表进行变异是一种不好的做法。

【讨论】:

  • 谢谢!我真的很傻,为这样一个愚蠢的错误而迟钝!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多