Python 字符串切片步长说明
我对切片中的步长参数有点搞不清楚。
比如说,"123456"[::-2]
这个操作会得到 "642"
,但是为什么 "123456"[1::-2]
会得到 "2"
,而 "123456"[2::-2]
又会得到 "31"
呢?
6 个回答
6
这是因为语法是 string[start:end:step]
"123456"[::-2]
这个结果是 "642",因为它是从最后一个字符开始的。你没有指定从哪个位置开始切片,所以它会从最后一个字符往回走2个字符,直到到达第一个字符。
"123456"[1::-2]
这个结果是 "2",因为你告诉Python从第二个字符开始(字符串中的索引1),然后让它从那个位置往回走2步。在这种情况下,Python显然只会返回 "2"。这是因为当Python尝试往回走2步时,已经在第一步就碰到了字符串的第一个字符。
"123456"[2::-2]
你现在应该能搞明白这个了。不过我还是再解释一下。你告诉Python从第三个字符(索引2)开始,然后往回走2步,直到到达第一个字符。所以它会从 "3" 开始,然后往回走2步,结果碰到了第一个字符 - 也就是 "1"。所以Python会给你 "31"
7
记住,索引是从零开始的。考虑到这一点,如果你把你的字符串改成 '012345'
,可能会更清楚:
In [1]: '012345'[1::-2]
Out[1]: '1'
In [2]: '012345'[2::-2]
Out[2]: '20'
In [3]: '012345'[5::-2]
Out[3]: '531'
正如你所看到的,切片确实是从正确的索引开始的,并且在每一步都以正确的(负数)步长进行,直到到达字符串的开头。
36
最简单的解释方式就是直接看你的例子:
"123456"[::-2]
# This takes the whole string ([::])
# Then it works backward (-)
# and it does every other character (2)
"123456"[1::-2]
# This is also working backward (-)
# every other character (2)
# but starting at position 1, which is the number 2.
"123456"[2::-2]
# Again, working backward (-)
# Every other character (2)
# begin at position 2, so you end up with positions 2, and 0, or '31'
切片的语法是 [<开始>:<结束>:步长]
。如果省略了 <开始>
,而且步长是负数,那么它就会从字符串的末尾开始。