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文档相矛盾,理想情况下在哪里记录了这种不同。
*切片索引有有用的默认值;省略的第一个索引默认为零,省略的第二个索引默认为要切片的字符串的大小。
- [3, 2, 1]l[len(l)::-1]是。。。。。。。当你开始的时候是一backwards端去。
- 现在该是停止在第三集的索引,当字符串是由反向的一步达到1立即停止。这就是为什么它返回空的列表
- 该文件excerpt是不正确的。它只适用当步长是阳性的。在事实上,有一个整数的值是对应于默认的索引步骤停止时,因为它是- 1,1 logically会是这样,已经到Python的特殊意义。你得到所需的None使用索引。它的"缺陷"在该层的符号。
您所引用的文档是教程,它只提供了关于Python语法和语义的非正式概述。它不能解释所有的细节。您会注意到,您链接到的教程页面甚至没有讨论负索引。
实际文档在"序列类型"下的库参考中给出。虽然第一次读起来有点简洁,不容易理解,但它确实澄清了对于一个片[i:j:k]:
If i or j are omitted or None, they become"end" values (which end depends on the sign of k).
号
- 太好了,这正是我要找的。我找不到明确解释i和j根据k的符号翻转的文档。我想,向入门教程询问精确的语言是不合理的,尽管不幸的是,当你谷歌"python slicing"时,该教程是唯一的官方文档。
- 它说,根据K的符号,它们变成了"最终值"。但是这些最终值是什么?当k为正时,最终值是什么?当k为负时,最终值是什么?
- @asadmoosvi:在同一文档中解释了这一点:"如果i或j大于len(s),则使用len(s)。如果省略或没有,请使用0。如果j被省略或没有,使用len(s)。"只是如果步骤为负,i/j到none/len(s)的映射可能会切换。
l[::-1]与l.__getitem__(slice(None, None, -1))相同。由于开始和停止都是None,列表将从一端遍历到另一端。step参数决定了方向和步骤。