这种切片行为是否已定义?
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 的停止时,这意味着从 1
到 1
。由于停止是排他的,因此排除了唯一的项目,结果为空。当给出 -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]
,依此类推。
我正在处理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 的停止时,这意味着从 1
到 1
。由于停止是排他的,因此排除了唯一的项目,结果为空。当给出 -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]
,依此类推。