为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

汪汪一只猫 2022-08-11 20:22:25
我知道切片语法包含3个参数,即:开始停步具有以下默认值:开始 = 0停止 = 字符串的长度步骤 = 1所以,对于> string = "abc"> string[::]会再来> "abc"但是,对于> string[::-1]它不应该返回:> "a"由于,string[start = 0] = 'a' 然后,string[start + step],即 string[0-1] = 'c',但由于它不小于 stop = 3,它将中断。或者我是否在错误的方向上思考,python只是将字符串切成通常的方向,如果步骤为负,则返回该字符串的反向?为了简化,负步骤如何在内部工作?
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

当提供负步长值时,Python 会交换开始值和停止值。此外,如果未提供开始值和停止值,则默认为序列的开头和结尾。

给定 ,内置类型文档的“通用序列操作”部分中的以下引用适用:s[i:j:k]

如果省略 i 或 j 或 None,它们将成为“结束”值(哪个结束取决于 k 的符号)。


关于它在引擎盖下的工作方式,在CPython中有两个用于处理列表下标的函数,list_subscript()(用于阅读)和list_ass_subscript()(用于分配)。

在这两个函数中,在验证下标是否指定了切片后,将调用 PySlice_Unpack() 和 PySlice_AdjustIndices() 来提取和规范化开始和停止值。

启动值处理

从 PySlice_Unpack():

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 - 1length

停止值处理

从 PySlice_Unpack():

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


查看完整回答
反对 回复 2022-08-11
?
皈依舞

TA贡献1851条经验 获得超3个赞

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



查看完整回答
反对 回复 2022-08-11
  • 2 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信