反转字符串:字符串[::-1]有效,但字符串[0::-1]和其他字符串无效

2024-05-23 13:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点像一个python/编程新手,我只是在玩字符串切片。因此,简单的string[::-1]字符串反向方法工作得很好,正如我们所知,但是在下面的代码中还有其他实例会产生意外的结果:

In [1]: string = "Howdy doody"

In [2]: string[::]
Out[2]: 'Howdy doody'

In [3]: string[::-1]
Out[3]: 'ydood ydwoH'

In [4]: string[0:]    
Out[4]: 'Howdy doody'

In [5]: string[0::-1]
Out[5]: 'H'     # what up with this?

In [6]: string[:len(string)]
Out[6]: 'Howdy doody'

In [7]: string[:len(string):-1]
Out[7]: ''     # what up with this too?

In [8]: string[0:len(string)]
Out[8]: 'Howdy doody'

In [9]: string[0:len(string):-1]
Out[9]: ''    # And what up here too.

我已经对上面的几行进行了评论,我希望字符串可以反转,但是我很惊讶地看到为什么它们不能简单地反转字符串。有人知道这是怎么回事吗?


Tags: 字符串instringlen编程with切片out
2条回答

在所有不起作用的情况下,都是从开始,然后向后移动。没有比开头更向后的了,所以你就没有更多的字符了。

这就是解决办法:

>>> string[len(string)::-1]
'ydood ydwoH'

切片符号是startendstep。当step为负时,start应该大于end才能得到任何结果。如果留空([::-1]),则会自动跟踪细微差别

在您只得到'H'的情况下,可能会混淆为什么存在anything。但想想写下的解释:

Beginning with the character at start, increment by step until (but not including) end

现在很明显,因为从0开始,0字符被包括在内

切片表示法“[a:b:c]”是指“从a开始以c的增量计数,直至b独占”。如果c为负数,则倒数,如果省略,则为1。如果a被省略,那么你就尽可能从你计数的方向开始(因此,如果c是正的,那就是开始,如果是负的,那就是结束)。如果b被省略,那么你就尽可能地朝着你正在计数的方向结束(所以如果c是正的,则结束;如果是负的,则开始)。如果ab为负数,则是与结束(最后一个字符是-1)的偏移量,而不是开始。

好的,所以string[0::-1]是一个字符,它表示“尽可能从索引0向后计数”。尽可能的是字符串的开头。

string[0:len(string):-1]或就这一点而言,string[0:anything:-1]是微妙不同的。它为空的原因与string[1:0]为空的原因相同。无法从开始处到达切片的指定结尾。您可以将其视为在“开始”之前结束的切片(因此为空),也可以将结束点自动调整为等于开始点(因此切片为空)。

string[:len(string):-1]表示“从结尾向后计数,但不包括索引len(string)”。无法访问该索引,因此切片为空。

您没有尝试string[:0:-1],但这意味着“从结尾向后计数,但不包括索引0”。所以这就是除了第一个角色以外的全部,颠倒过来。[:0:-1][::-1],正如[0:len(string)-1][:]。在这两种情况下,切片的排除结尾都是索引,该索引本来是切片的包含的最后一个字符,但省略了结尾。

您也没有尝试string[-1::-1],这与string[::-1]相同,因为-1表示字符串的最后一个字符。

相关问题 更多 >