为什么Python返回负列表索引?

如果我有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 

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

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

如果您发现您需要负指数来指示错误,那么您可以简单地检查该情况并自行提出exception(或随时处理):

 index = get_some_index() if index < 0: raise IndexError("negative list indices are considered out of range") do_something(l[index]) 

这是因为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) 

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

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

你的名单

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

有10个项目。 由于索引从0开始,最后一个项目将在索引9 。 当你试图在索引10访问你的列表时,Python正确地抛出一个IndexErrorexception来告诉你这不是一个有效的索引值并且是越界的。

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

@ Lattyware的答案已经告诉你如何生成/抛出一个exception,我希望这能回答你最初的问题。