关于字符串:请解释Python序列反转

Please explain Python sequence reversal

不知道我是从哪里捡来的,但它卡住了,我一直在用它。

有人能解释一下这个字符串反转是如何工作的吗?我使用它来测试回文字符串,而不首先将其转换为可变类型。

1
2
3
4
>>> word ="magic"
>>> magic = word[::-1]
>>> magic
'cigam'

我会尽我所能的猜测,但我不想带着任何关于这个有用技巧背后内在的先入为主的想法。


切片符号如下:

1
my_list[start:end:step]

所以,当你做[::-1]时,它的意思是:

  • start无(默认)
  • end无(默认)
  • step:-1(下降顺序)
  • 小精灵

    所以,您将从列表的末尾(默认)转到第一个元素(默认),将索引减少一个(-1)。

    所以,正如许多答案所说,没有排序,也没有就地交换,只是切片符号。


    你可以在这里看看-这是一个扩展的部分。


    "Python2.3的新功能",第15节,"扩展片"。


    这个"技巧"只是对序列应用切片操作的一个特殊实例。您也可以使用它来生成列表或元组的反向副本。同一个家族的另一个"把戏":[:]经常被用来制作列表的(浅)副本。

    "Python2.3的新特性"是进入迷宫的意外入口。让我们从一个更明显的开始(?)放置,序列对象的当前2.x文档。

    在序列运算表中,您将看到一行operation=s[i:j:k],result="slice of s from i to j with step k",notes="(3)(5)"。

    注3表示"如果i或j为负,则索引相对于字符串的结尾:用len(s)+i或len(s)+j替换。但请注意-0仍然是0。"

    注5表示"从i到j的s切片(步骤k)被定义为索引x=i+n*k的项目序列,这样0<=n<(j-i)/k。换句话说,索引为i、i+k、i+2*k、i+3*k等,到达j时停止(但不包括j)。如果i或j大于len(s),则使用len(s)。如果省略i或j或不省略,它们将成为"结束"值(结束取决于k的符号)。注意,k不能为零。如果k不是,则按1处理。"

    我们有k=-1,所以使用的指数是i,i-1,i-2,i-3等等,当达到j时停止(但不包括j)。为了获得观察到的效果,i的"end"值必须是len(s)-1,j的"end"值必须是-1。因此,使用的指数是last,last-1,…,2,1。

    另一个切入点是考虑如果[::-1]在语言中不存在,我们如何为任何序列产生这样的结果:

    1
    2
    3
    def reverse_traversal_of_sequence(s):
        for x in range(len(s) - 1, -1, -1):
            do_something_with(s[x])