2 回答
TA贡献1803条经验 获得超3个赞
当提供负步长值时,Python 会交换开始值和停止值。此外,如果未提供开始值和停止值,则默认为序列的开头和结尾。
给定 ,内置类型文档的“通用序列操作”部分中的以下引用适用:s[i:j:k]
如果省略 i 或 j 或 None,它们将成为“结束”值(哪个结束取决于 k 的符号)。
关于它在引擎盖下的工作方式,在CPython中有两个用于处理列表下标的函数,list_subscript()
(用于阅读)和list_ass_subscript()
(用于分配)。
在这两个函数中,在验证下标是否指定了切片后,将调用 PySlice_Unpack()
和 PySlice_AdjustIndices()
来提取和规范化开始和停止值。
启动值处理
if (r->start == Py_None) { *start = *step < 0 ? PY_SSIZE_T_MAX : 0;
如果起始值为负,则起始值设置为最大可能值。None
然后,在 PySlice_AdjustIndices() 中
:
else if (*start >= length) { *start = (step < 0) ? length - 1 : length;
如果起始值大于列表的长度(这无疑是由于上面的赋值)并且步长值为负,则起始值设置为(即 指序列的长度)。length - 1
length
停止值处理
if (r->stop == Py_None) { *stop = *step < 0 ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX;
如果止损值为负,则停止值设置为尽可能小的值。None
然后,在 PySlice_AdjustIndices() 中
:
if (*stop < 0) { *stop = (step < 0) ? -1 : 0;
如果停止值为负(这是由于上面的赋值)并且步长值为负,则停止值设置为 -1。
因此,使用 的输入,您最终会得到:string[::-1]
起始值:len(字符串) - 1
停止值:-1
步骤: -1
TA贡献1851条经验 获得超3个赞
当负值作为 传递时,默认值为 和 反转。 从“序列开始”更改为“序列结束”,并从“序列结束”更改为“序列开始”。如果它不这样做,你在执行一个完整的切片时会遇到问题,因为任何切片的结尾都是独占的; 会排除第一个字符(因为不会被包括在内),你不能通过一个过去,因为那只是意味着同样的事情(感谢Python如何处理负索引),你根本不会切除任何东西。使默认值切换,以便省略结束(或等效地显式传递)一直运行到开头,包括,是唯一明智的解决方案。step
start
stop
start
stop
mystr[len(mystr)-1:0:-1]
0
-1
0
len(mystr)-1
None
添加回答
举报