4

通常要反转列表,应执行以下操作:

>>>>l = [1, 2, 3, 4, 5]
>>>>l[::-1]  
[5, 4, 3, 2, 1]

但不是这样的确切语法:

list[<start>:<end>:<stop>]

如果我不提供可选参数,则默认值如下(如果我错了,请纠正我:

<start> = 0(Beginning of list)
<end>   = 5(Length of list)
<step>  = 1

因此,如果我提供可选参数,它实际上应该会产生相同的结果:

>>>>l[0:5:-1]
>>>>[]

但是相反,我得到一个空列表(我知道为什么会发生这种情况),但是在第一种情况下,python 采用的默认值是什么?它应该采用 0 和 5 作为默认值并且什么都不产生,或者是[::-1 ]不同于list[start:end:stop]

4

3 回答 3

4

l[::-1]等价于l[slice(None,None,-1)],其中slice([start], stop[, step])返回一个切片对象。考虑以下:

>>> slice(None,None,-1).indices(5)
(4, -1, -1)
>>> slice(None,None,1).indices(5)
(0, 5, 1)

这是您在使用扩展索引语法访问列表时看到的确切行为,即l[start:stop:step].

>>> l[::-1]
[5, 4, 3, 2, 1]
>>> l[slice(None,None,-1)]
[5, 4, 3, 2, 1]

...但是在第一种情况下,python 采用的默认值是什么?

开始/停止的值(如果未提供)基于索引的数量(列表的长度)以及step. 具体来说,请参阅切片对象的 CPython源代码( Objects/sliceobject.c)

if (r->start == Py_None) {
    *start = *step < 0 ? length-1 : 0;
} else {
    /* .... */
}

if (r->stop == Py_None) {
    *stop = *step < 0 ? -1 : length;
} else {
    /* .... */
}
于 2012-05-28T17:31:06.213 回答
2

如果您的步骤比列表末尾的开始为负..您可以使用负索引来做到这一点。

尝试:

l[-1:-6:-1]
于 2012-05-28T17:27:27.610 回答
0

如果您向后遍历列表,则开始和停止是相反的,试试这个:

l[5:0:-1]

有趣的是,它只对 5 个元素中的 4 个进行切片(因为“end”应该是末尾的一个),这不起作用:

l[5:-1:-1]

这可以满足您的要求:

l[5::-1]
于 2012-05-28T17:24:17.147 回答