Python:为什么不[0,1,2] [ - 1:1]引发错误?

duh*_*ime 1 python slice python-2.7

在Python中,可以使用数组切片表示法来获取可迭代的值的子集:

a = [0,1,2]
a[0:2]
# returns all members from the 0th to the 2nd: [0,1]
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试提取第一个值为负且第二个值为正的切片,则请求将返回一个空列表:

a[-1:2]
# returns []
Run Code Online (Sandbox Code Playgroud)

这对我来说是违反直觉的,因为-1:2定义的范围似乎是由0:2定义的范围的超集.

我知道可以使用负片索从Python切片表示法中取出数组的末尾(例如:a[-1]2),但它看起来像第一个切片位置的负值而第二个切片中的正值应该引发错误或返回由同一切片返回的值的超集,其中第一个位置为0.

我很想知道切片请求返回的空列表背后的动机,在第一个位置有负值,如果有人碰巧在这个方面有洞察力,那么在第二个位置有正值...

Eri*_*nil 9

负指数对于获得最后的元素非常有用:

>>> letters = list('abcdefgh')
>>> letters[-3:]
['f', 'g', 'h']
>>> letters[-3:-1]
['f', 'g']
Run Code Online (Sandbox Code Playgroud)

在这种情况下过早提出异常将是一个巨大的错误.

您还可以混合负面和正面指数:

>>> letters[-5:6]
['d', 'e', 'f']
Run Code Online (Sandbox Code Playgroud)

这意味着在第5个最后一个元素之后和第六个元素之前的元素.

在你的情况下:

>>> letters[-1:2]
[]
Run Code Online (Sandbox Code Playgroud)

返回一个空列表,因为最后一个和第二个之间没有元素.

但它并不总是空的:

>>> ['a'][-1:2]
['a']
>>> ['a','b'][-1:2]
['b']
Run Code Online (Sandbox Code Playgroud)