这种切片行为是否已定义?

Is this slicing behavior defined?

我正在处理Python的切片,遇到了意想不到的结果。

示例:

print([1, 2, 3][0:-4:-1])

Returns [1]

print([1, 2, 3][0:-3:-1])
print([1, 2, 3][0:-2:-1])
print([1, 2, 3][0:-1:-1])

其中每一个 returns [](符合预期)。

这是怎么发生的?

谢谢,Reyha24。

slice中,第一项(开始)是包容性的。第二个参数(stop)是 exclusive。当给出 -3 的停止时,这意味着从 11。由于停止是排他的,因此排除了唯一的项目,结果为空。当给出 -2 时,它转换为索引 1。一旦给出索引 0,您就已经通过了索引 1,因为步长为负。因此,结果为空。你会得到与 -1 类似的东西。但是,从末尾取 -4 会变成 -1,因为列表中只有三项。从 0 到 -1 负步长是可能的:索引 0 被包括在内,索引 -1 不是因为它出现在列表的后面。

我认为如果你反转切片并转换为常规索引,这会更清楚。由于 python 使用半开区间,因此 [0:-4:-1] 转换为 [1, 2, 3][-3:1]-3 在这种情况下对应于索引 0,因此这将转换为 [1, 2, 3][0:1],这只是第一个元素。第二种情况,[0:-3:-1],转换为[-2:1],即[1:1],为空。第三种情况转换为[2:1],依此类推。