当前位置: 代码迷 >> python >> Python:为什么[0,1,2] [-1:1]不会引发错误?
  详细解决方案

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

热度:97   发布时间:2023-06-13 16:44:59.0

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

a = [0,1,2]
a[0:2]
# returns all members from the 0th to the 2nd: [0,1]

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

a[-1:2]
# returns []

这与我的直觉相反,因为-1:2定义的范围似乎是0:2定义的范围的超集

我知道一个人可以使用Python切片符号(例如, a[-1]为2)从数组的末尾使用负索引,但是似乎第一个切片位置为负值,第二个切片位置为正值要么引发错误,要么返回由同一片返回的值的超集,且第一个位置为0。

我很想知道切片请求返回的空列表背后的动机,如果有人碰巧对此方面有见识,则该请求的第一个位置为负值,第二个位置为正值...

负索引对于获取最后一个元素非常有用:

>>> letters = list('abcdefgh')
>>> letters[-3:]
['f', 'g', 'h']
>>> letters[-3:-1]
['f', 'g']

在这种情况下过早引发异常将是一个巨大的错误。

您还可以混合使用负索引和正索引:

>>> letters[-5:6]
['d', 'e', 'f']

这表示最后5个元素之后和6个元素之前的元素。

在您的情况下:

>>> letters[-1:2]
[]

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

不过,它并不总是空的:

>>> ['a'][-1:2]
['a']
>>> ['a','b'][-1:2]
['b']

我认为这只是一个误解:负值被解释为“从头算起”,因此[-1:2]并不是[0:2]的超集。 反过来! 因为-1是什么(实际值取决于可迭代的长度),所以它始终>= 0

在您的情况下,您有一个长度为3的数组,因此-1被解释为2并且您希望获得2到2之间的项目(停止排他),因此您将获得一个空列表。

假设您想要最后10个元素的一部分。 这可以通过a[-10:]轻松完成。 如果那会引发错误,您将编写不愉快的内容,例如a[len(a)-10:] 甚至更糟a是,如果a不是一个以前使用过的列表所包含的变量,而是您现在所计算的内容,则您需要创建一个新的变量,以使长度变长。 而且,如果只能在末尾写[-10:] ,那么您就没有。

显然,当这不是预期的行为时,这可能会有缺点,但是为了简洁起见,在其他情况下,这可能是值得的。