如何反转字符串与字符串一起工作[ : :-1]

我知道切片语法包含3个参数,即:

  1. 开始

具有以下默认值:

  1. 开始 = 0

  2. 停止 = 字符串的长度

  3. 步骤 = 1

所以,对于

> string = "abc"

> string[::]

会再来

> "abc"

但是,对于

> string[::-1]

它不应该返回:

> "a"

由于,string[start = 0] = 'a' 然后,string[start + step],即 string[0-1] = 'c',但由于它不小于 stop = 3,它将中断。

或者我是否在错误的方向上思考,python只是将字符串切成通常的方向,如果步骤为负,则返回字符串的反向?为了简化,负步骤如何在内部工作?


汪汪一只猫
浏览 134回答 2
2回答

繁星点点滴滴

当提供负步长值时,Python 会交换开始值和停止值。此外,如果未提供开始值和停止值,则默认为序列的开头和结尾。给定 ,内置类型文档的“通用序列操作”部分中的以下引用适用:s[i:j:k]如果省略 i 或 j 或 None,它们将成为“结束”值(哪个结束取决于 k 的符号)。关于它在引擎盖下的工作方式,在CPython中有两个用于处理列表下标的函数,list_subscript()(用于阅读)和list_ass_subscript()(用于分配)。在这两个函数中,在验证下标是否指定了切片后,将调用&nbsp;PySlice_Unpack()&nbsp;和&nbsp;PySlice_AdjustIndices()&nbsp;来提取和规范化开始和停止值。启动值处理从&nbsp;PySlice_Unpack():if&nbsp;(r->start&nbsp;==&nbsp;Py_None)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*start&nbsp;=&nbsp;*step&nbsp;<&nbsp;0&nbsp;?&nbsp;PY_SSIZE_T_MAX&nbsp;:&nbsp;0;如果起始值为负,则起始值设置为最大可能值。None然后,在&nbsp;PySlice_AdjustIndices() 中:else&nbsp;if&nbsp;(*start&nbsp;>=&nbsp;length)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*start&nbsp;=&nbsp;(step&nbsp;<&nbsp;0)&nbsp;?&nbsp;length&nbsp;-&nbsp;1&nbsp;:&nbsp;length;如果起始值大于列表的长度(这无疑是由于上面的赋值)并且步长值为负,则起始值设置为(即 指序列的长度)。length - 1length停止值处理从&nbsp;PySlice_Unpack():if&nbsp;(r->stop&nbsp;==&nbsp;Py_None)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*stop&nbsp;=&nbsp;*step&nbsp;<&nbsp;0&nbsp;?&nbsp;PY_SSIZE_T_MIN&nbsp;:&nbsp;PY_SSIZE_T_MAX;如果止损值为负,则停止值设置为尽可能小的值。None然后,在&nbsp;PySlice_AdjustIndices() 中:if&nbsp;(*stop&nbsp;<&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*stop&nbsp;=&nbsp;(step&nbsp;<&nbsp;0)&nbsp;?&nbsp;-1&nbsp;:&nbsp;0;如果停止值为负(这是由于上面的赋值)并且步长值为负,则停止值设置为 -1。因此,使用 的输入,您最终会得到:string[::-1]起始值:len(字符串) - 1停止值:-1步骤: -1

皈依舞

当负值作为 传递时,默认值为 和 反转。 从“序列开始”更改为“序列结束”,并从“序列结束”更改为“序列开始”。如果它不这样做,你在执行一个完整的切片时会遇到问题,因为任何切片的结尾都是独占的; 会排除第一个字符(因为不会被包括在内),你不能通过一个过去,因为那只是意味着同样的事情(感谢Python如何处理负索引),你根本不会切除任何东西。使默认值切换,以便省略结束(或等效地显式传递)一直运行到开头,包括,是唯一明智的解决方案。stepstartstopstartstopmystr[len(mystr)-1:0:-1]0-10len(mystr)-1None
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python