x = (1, 2, 3, 4)
此处,x[0:4:-1]
提供空tuple
()
。为什么会这样?
我认为它只会给出一个反转的元组(4,3,2,1)
......
答案 0 :(得分:3)
您要求所有值从0开始,在4之前结束,一次计数-1。那没什么价值。
你想要做的是从3开始,在-1之前结束,一次计数-1。除了......你不能把-1
放在那里,因为那意味着“从头到尾”。所以,你必须写“从3开始,当你用完整个序列时结束,一次计数-1”,如下所示:
x[3::-1]
或者更简单:
x[::-1]
将切片转换为显式循环可能有助于您的理解。它看起来像这样:
def slicify(sequence, start, end, step):
if start < 0: start += len(sequence)
if end < 0: end += len(sequence)
result = []
while (start < end if step > 0 else start > end):
result.append(sequence[start])
start += step
return result
但这只是大致正确的。确切的定义在Sequence Types下的文件中,注释5:
s
从i
到j
的切片k
被定义为索引为x = i + n*k
的项目序列,0 <= n < (j-i)/k
}。换句话说,索引是i
,i+k
,i+2*k
,i+3*k
等等,在达到j
时停止(但从不包括{{1} }})。如果j
或i
大于j
,请使用len(s)
。如果省略len(s)
或i
或j
,则它们会变为“结束”值(结束取决于None
的符号)。请注意,k
不能为零。如果k
为k
,则会将其视为None
。
答案 1 :(得分:3)
您需要省略开始和结束,或反转开头和结尾:
x[::-1] # (4, 3, 2, 1)
x[3:0:-1] # (4, 3, 2)
x[3::-1] # (4, 3, 2, 1)
x[3:-5:-1] # (4, 3, 2, 1)
不包括结束点,因此使用[3:0:-1]
进行切片仅返回三个元素。最后一个示例使用负值从元组的长度中减去,最后得到端点-1
。
使用负步幅意味着Python想要向后计数,从0开始你永远不会达到4。
请注意,Python切片语法不仅适用于元组;字符串和列表支持完全相同的语法。