6

如果我有这个包含 10 个元素的列表:

>>> l = [1,2,3,4,5,6,7,8,9,0]

为什么 l[10] 会返回 IndexError,而 l[-1] 返回 0?

>>> l[10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> l[0]
1
>>> l[-1]
0
>>> l[-2]
9

如果列表中没有先前的元素,我想要做的是抛出错误。

4

4 回答 4

21

在 Python 中,负数列表索引表示从列表右侧开始计数的项目(即 的l[-n]简写l[len(l)-n])。

如果您发现需要负索引来指示错误,那么您可以简单地检查该情况并自己引发异常(或当场处理):

index = get_some_index()
if index < 0:
    raise IndexError("negative list indices are considered out of range")
do_something(l[index])
于 2012-06-27T21:43:02.850 回答
2

这是因为l[-1]等于l[len(l)-1],同样l[-2]等于l[len(l)-2]

>>> lis=[1,2,3,4,5]
>>> lis[-1],lis[-2],lis[-3]
(5, 4, 3)
>>> lis[len(lis)-1],lis[len(lis)-2],lis[len(lis)-3]
(5, 4, 3)
于 2012-06-27T21:43:39.247 回答
1

Q:为什么会l[10]返回一个IndexError,但是l[-1]返回0

:因为 Python(与许多其他语言一样)中的索引值是从零开始的。这意味着第一项存储在 index 0

你的清单

l = [1,2,3,4,5,6,7,8,9,0]

有10个项目。由于索引从 开始0,最后一项将在 index 9。当您尝试在 index 处访问您的列表时10,Python 会正确地抛出一个IndexError异常来告诉您这不是一个有效的索引值并且超出了范围。

Python 还使用负索引值的约定从列表或序列的“末尾”访问项目。索引值-1表示列表中的最后-2一项,倒数第二项等。由于列表中的最后一项是0,这就是l[-1]返回的内容。

@Lattyware 的回答已经向您展示了如何生成/抛出异常,我希望这能回答您最初的问题。

于 2012-06-27T22:15:58.310 回答
0

因为,索引值从 0 开始。在您的情况下,最后一个索引值为 9,9 之后不再有索引值。当您尝试打印超出索引值限制的值时,它必须抛出错误

于 2018-04-09T06:27:57.610 回答