Python 字符串切片步长说明

25 投票
6 回答
27436 浏览
提问于 2025-04-17 04:19

我对切片中的步长参数有点搞不清楚。
比如说,"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'

切片的语法是 [<开始>:<结束>:步长]。如果省略了 <开始>,而且步长是负数,那么它就会从字符串的末尾开始。

撰写回答