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

为什么Python返回负列表索引?,python,Python,如果我有10个元素的列表: >>> l = [1,2,3,4,5,6,7,8,9,0] 为什么l[10]返回索引器,而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 >>>

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

>>> l = [1,2,3,4,5,6,7,8,9,0]
为什么l[10]返回索引器,而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
>>l[10]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
索引器:列表索引超出范围
>>>l[0]
1.
>>>l[-1]
0
>>>l[-2]
9

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

在Python中,负列表索引表示从列表右侧开始计数的项目(也就是说,
l[-n]
l[len(l)-n]
的缩写)

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

index=get\u some\u index()
如果指数<0:
提升索引器(“负面列表索引被认为超出范围”)
做点什么(l[索引])

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

Q:为什么
l[10]
会返回
索引器
,而
l[-1]
会返回
0

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

你的名单

l = [1,2,3,4,5,6,7,8,9,0]
有10个项目。由于索引从
0
开始,最后一项将位于索引
9
。当您尝试在索引
10
处访问列表时,Python正确地抛出了一个
IndexError
异常,告诉您这不是有效的索引值,超出了范围

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


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

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

不太确定我是否喜欢索引器-但至少现在它有一条消息。如果我知道最后一个元素是一个内置列表,但我不能使用-1得到它,我会非常惊讶…加上扩展切片需要一些工作…@JonClements我不是建议使用子类,所以列表不会有不同的行为,只是在不希望负索引成为可能的特定情况下,处理它。你说“列表中没有以前的元素”是什么意思?如果“previous”的意思是“在当前元素的左边”,那么Lattyware的答案应该很好。但我忍不住想知道你是不是还有别的意思。
l = [1,2,3,4,5,6,7,8,9,0]