关于python:为什么list [:: – 1]不等于list [:len(list): – 1]?

Why does list[::-1] not equal list[:len(list):-1]?

在python中切片时,省略切片的end部分(即list[:end:]中的末端)会导致end被定义为"要切片的字符串的大小"。*

但是,在片中使用step参数(list[::step]中的步骤)时,至少在step参数为-1时,这似乎不成立。一个简单的例子:

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

这表明,在传递step参数的情况下,省略的end值不等于显式传递被切片对象的大小。

也许这只是我在阅读文档时的一个失败,但我想理解为什么我上面的示例似乎与关于在切片中省略end值的python文档相矛盾,理想情况下在哪里记录了这种不同。

*切片索引有有用的默认值;省略的第一个索引默认为零,省略的第二个索引默认为要切片的字符串的大小。


您所引用的文档是教程,它只提供了关于Python语法和语义的非正式概述。它不能解释所有的细节。您会注意到,您链接到的教程页面甚至没有讨论负索引。

实际文档在"序列类型"下的库参考中给出。虽然第一次读起来有点简洁,不容易理解,但它确实澄清了对于一个片[i:j:k]

If i or j are omitted or None, they become"end" values (which end depends on the sign of k).


l[::-1]l.__getitem__(slice(None, None, -1))相同。由于开始和停止都是None,列表将从一端遍历到另一端。step参数决定了方向和步骤。