IndexError:在 Python 中列出超出范围的分配索引

目录

IndexError: list assignment index out of range in Python

  1. IndexError:列表分配索引超出范围
  2. (CSV) IndexError:列表索引超出范围
  3. sys.argv[1] IndexError: 列表索引超出范围
  4. IndexError:弹出索引超出范围

确保根据您的错误消息单击正确的副标题。

IndexError: Python 中的列表赋值索引超出范围

当我们尝试在列表中不存在的索引处分配值时,会出现 Python“IndexError:列表分配索引超出范围”。

要解决该错误,请使用方法append()将项目添加到列表的末尾,例如my_list.append('b')

索引错误列表分配索引超出范围

下面是错误如何发生的示例。

主程序
my_list = ['a', 'b', 'c'] # ⛔️ IndexError: list assignment index out of range my_list[3] = 'd'

超出范围的索引赋值

该列表的长度为3. 由于 Python 中的索引是从零开始的,因此列表中的第一个索引是0,最后一个是2

A b C
0 1个 2个

尝试将值分配给范围之外的任何正索引0-2会导致IndexError.

使用 append() 将一个项目添加到列表的末尾

如果您需要将项目添加到列表的末尾,请改用list.append()方法。

主程序
my_list = ['a', 'b', 'c'] my_list.append('d') my_list.append('e') print(my_list) # 👉️ ['a', 'b', 'c', 'd', 'e']

list.append ()方法将一个项目添加到列表的末尾。

该方法在改变原始列表时返回 None 。

改变列表中最后一个索引处元素的值

如果您打算更改列表中最后一个索引的值,请使用-1.

主程序
my_list = ['a', 'b', 'c'] my_list[-1] = 'z' print(my_list) # 👉️ ['a', 'b', 'z']

当索引以负号开头时,我们从列表末尾开始倒数。

Python 索引是从零开始的,因此列表中的第一项的索引为,最后一项的索引为 0-1 len(a_list) - 1

声明一个包含N个元素的列表并更新某个索引

或者,您可以声明一个包含 N 个带None
值元素的列表。

主程序
my_list = [None] * 5 print(my_list) # 👉️ [None, None, None, None, None] my_list[4] = 'hello' print(my_list) # 👉️ [None, None, None, None, 'hello']

您在列表中指定的项目将在操作返回的新列表中包含 N 次。

它不一定是None,值可以是0,空字符串或适合您的用例的任何其他值。

确保将要重复的值包装在列表中。

如果列表包含特定索引处的值,则您可以更改它。

使用try/except语句来处理错误

如果指定列表索引不存在时需要处理错误,请使用
try/except语句。

主程序
my_list = ['a', 'b', 'c'] try: my_list[3] = 'd' except IndexError: # 👇️ this runs print('The specified assignment index does NOT exist')

示例中的列表有 3 个元素,因此它的最后一个元素的索引为2

我们将赋值包装在一个try/except块中,因此IndexError由块处理except

如果需要忽略错误,也可以pass在块中使用语句。except

主程序
my_list = ['a', 'b', 'c'] try: my_list[3] = 'd' except IndexError: pass

pass语句什么都不做,当语法上需要语句但程序不需要任何操作时使用。

获取列表的长度

如果需要获取列表的长度,请使用该len()函数。

主程序
my_list = ['a', ' b', 'c'] print(len(my_list)) # 👉️ 3

len ()函数返回对象的长度(项目数)。

该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

如果需要
在赋值之前
检查索引是否存在if,请使用语句。

主程序
my_list = ['a', 'b', 'c'] idx = 3 if len(my_list) > idx: my_list[idx] = 'Z' print(my_list) else: # 👇️ this runs print(f'index {idx} is out of range')
如果列表的长度为3,那么它的最后一个索引是(因为索引是从零开始的)。 2

这意味着您可以检查列表的长度是否大于您尝试分配给的索引。

尝试为特定索引处的空列表赋值

请注意,如果您尝试在特定索引处分配给一个空列表,您总是会得到一个IndexError.

主程序
my_list = [] print(my_list) # 👉️ [] print(len(my_list)) # 👉️ 0 # ⛔️ IndexError: list assignment index out of range my_list[0] = 'a'

您应该打印您尝试访问的列表及其长度,以确保变量存储您期望的内容。

使用该extend()方法将多个项目添加到列表的末尾

如果需要将多个项目添加到列表的末尾,请使用 方法extend()

list.extend方法采用可迭代对象(例如列表)并通过附加可迭代对象中
所有项目来扩展列表。

主程序
my_list = ['a', 'b'] my_list.extend(['c', 'd', 'e']) print(my_list) # 👉️ ['a', 'b', 'c', 'd', 'e']

该方法在改变原始列表时list.extend返回。None

(CSV) IndexError: 列表索引在 Python 中超出范围

Python CSV“IndexError: list index out of range”发生在我们尝试访问索引超出范围的列表时,例如 CSV 文件中的空行。

要解决该错误,请在通过索引访问该行之前检查该行是否不为空,或者检查该索引是否存在于列表中。

csv indexerror 列表索引超出范围

下面是错误如何发生的示例。

假设我们有以下CSV文件。

雇员.csv
first_name,last_name Alice,Smith Bob,Smith Carl,Smith

我们正在尝试按如下方式阅读它。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: csv_reader = csv.reader(csvfile, delimiter=',') for row in csv_reader: # ⛔️ IndexError: list index out of range print(row[0])
文件中的第二行CSV是空的,因此row 变量在第二次迭代时存储一个空列表。

在访问之前检查列表是否包含元素

解决该错误的一种方法是在通过索引访问列表之前检查列表是否包含任何元素。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: csv_reader = csv.reader(csvfile, delimiter=',') for row in csv_reader: if row: # 👈️ check if row contains items print(row[0])

if语句在每次迭代中检查列表是否真实。

所有不真实的值都被认为是虚假的。Python 中的虚假值是:

  • 定义为 falsy 的常量:NoneFalse.
  • 0任何数字类型的(零)
  • 空序列和集合:(""空字符串),()(空元组),[]
    (空列表),
    {}(空字典),set()(空集),range(0)(空范围)。
请注意,空列表是假的,包含至少 1 项的列表是真值。

检查你试图访问的索引是否存在于列表中

或者,您可以检查列表中是否存在您尝试访问的特定索引。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: csv_reader = csv.reader(csvfile, delimiter=',') idx = 1 for row in csv_reader: if len(row) > idx: print(row[idx])

len ()函数返回对象的长度(项目数)。

该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

如果列表的长度为2,那么它的最后一个索引是(因为索引是从零开始的)。 1

这意味着您可以检查列表的长度是否大于您尝试访问的索引。

使用try/except语句来处理错误

或者,您可以使用try/except块来处理错误。

主程序
import csv with open('employees.csv', newline='', encoding='utf-8') as csvfile: csv_reader = csv.reader(csvfile, delimiter=',') for row in csv_reader: try: print(row[1]) except IndexError: print('except block ran') continue

我们尝试在 index 访问当前迭代的列表1,如果 an
IndexError被引发,我们可以在except块中处理它或继续下一次迭代。

sys.argv [1] IndexError:Python 中的列表索引超出范围

sys.argv “IndexError: list index out of range in Python”发生在我们运行 Python 脚本时没有为所需的命令行参数指定值。

要解决该错误,请提供所需参数的值,例如
python main.py first second.

sys argv indexerror 列表索引超出范围

下面是错误如何发生的示例。

主程序
import sys print(sys.argv) # 👉️ ['main.py'] print(sys.argv[0]) # 👉️ 'main.py' # ⛔️ IndexError: list index out of range print(sys.argv[1])

我用python main.py.

sys.argv列表包含传递给 Python 脚本命令行参数。

argv[0]脚本的名称在哪里,argv[1]第一个提供的命令行参数等。

提供所有必需的命令行参数

要解决该错误,请确保在运行脚本时提供所有必需的命令行参数,例如python main.py first second.

主程序
import sys print(sys.argv) # 👉️ ['main.py', 'first', 'second'] print(sys.argv[0]) # 👉️ 'main.py' print(sys.argv[1]) # 👉️ 'first' print(sys.argv[2]) # 👉️ 'second'

请注意,列表中的第一项始终是脚本的名称。

这是否是完整路径名取决于操作系统。

检查列表是否sys.argv包含索引

如果您不必始终指定脚本尝试访问的所有命令行参数,请使用 if 语句检查列表是否包含sys.argv您尝试访问的索引。

主程序
import sys print(sys.argv) # 👉️ ['main.py'] idx = 1 if len(sys.argv) > idx: print(sys.argv[idx]) else: # 👇️ this runs print(f'index {idx} out of range')

我在不提供任何命令行参数的情况下运行脚本python main.py,因此不满足条件并且else块运行。

len ()函数返回对象的长度(项目数)。

该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

如果列表的长度为1,那么它的最后一个索引是(因为索引是从零开始的)。 0

这意味着您可以检查列表的长度是否大于您尝试访问的索引。

使用try/except语句来处理错误

或者,您可以使用try/except块来处理错误。

主程序
import sys print(sys.argv) # 👉️ ['main.py'] try: print(sys.argv[1]) except IndexError: # 👇️ this runs print('index out of range')

1我们尝试访问引发异常的索引处的列表项IndexError

您可以处理错误或使用块pass中的关键字except

IndexError: 在 Python 中弹出索引超出范围

当我们将列表中不存在的索引传递给方法时,会出现 Python“IndexError:弹出索引超出范围” pop()

要解决该错误,请将存在的索引传递给该方法或调用pop()
不带参数的方法以从列表中删除最后一项。

indexerror 弹出索引超出范围

下面是错误如何发生的示例。

主程序
my_list = ['a', 'b', 'c'] # ⛔️ IndexError: pop index out of range result = my_list.pop(3)

该列表的长度为3. 由于 Python 中的索引是从零开始的,因此列表中的第一项的索引为0,最后一项的索引为2

A b C
0 1个 2个
如果我们将范围之外的任何正索引传递0-2给该方法,我们将得到一个. pop()IndexError

如果您需要删除列表中的最后一项,请调用该方法而不向其传递索引。

主程序
my_list = ['a', 'b', 'c'] result = my_list.pop() print(result) # 👉️ 'c' # 👇️ ['a', 'b'] print(my_list)

list.pop方法删除列表中给定位置的项目并将其返回

如果未指定索引,该pop()方法将删除并返回列表中的最后一项。

您还可以使用负索引向后计数,例如my_list.pop(-1)
删除列表的最后一项,并
my_list.pop(-2)删除倒数第二项。

或者,您可以在将指定索引处的项目传递给之前检查它是否存在pop()

主程序
my_list = ['a', 'b', 'c'] print(len(my_list)) # 👉️ 3 idx = 3 if len(my_list) > idx: result = my_list.pop(idx) print(result) else: # 👇️ this runs print(f'index {idx} is out of range')

len ()函数返回对象的长度(项目数)。

该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

如果列表的长度为3,那么它的最后一个索引是(因为索引是从零开始的)。 2

这意味着您可以检查列表的长度是否大于您传递给的索引pop()

请注意,调用pop()空列表也会导致错误。

处理错误的另一种方法是使用块try/except

主程序
my_list = ['a', 'b', 'c'] idx = 3 try: result = my_list.pop(idx) except IndexError: # 👇️ this runs print(f'index {idx} is out of range')

如果使用pop()提供的索引调用方法引发IndexError,则运行该except块,我们可以在其中处理错误或使用pass
关键字忽略它。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: