GEEK
← 返回首页

什么是字符串切片(Slice)及其工作原理?

#随笔

字符串切片(Slice)是一种从字符串中提取部分内容的方式,使用 字符串[start:stop:step] 语法即可获取指定范围的字符,而不会修改原字符串。切片支持省略起始位置、结束位置和步长(step),还可以利用负步长快速实现字符串反转,是 Python 中处理文本最常用的操作之一。

什么是字符串切片(Slice)及其工作原理?

在上一节中,我们学习了如何通过**索引(Index)**访问字符串中的某一个字符。

例如:

my_str = "Hello world"

print(my_str[0])   # H
print(my_str[6])   # w
print(my_str[-1])  # d

索引一次只能获取一个字符

如果想获取:

  • 前五个字符
  • 后半部分字符
  • 中间一段文字
  • 每隔一个字符取一次

仅使用索引就会非常麻烦。

因此,Python 提供了字符串切片(Slice)


什么是字符串切片(Slice)?

字符串切片(Slice)的作用是:

从字符串中提取连续的一部分字符,生成一个新的字符串。

例如:

Hello world

我们希望得到:

Hello

或者:

world

甚至:

ell

都可以通过切片完成。

注意:

切片会返回一个新的字符串,不会修改原来的字符串。


切片的基本语法

字符串切片的语法如下:

字符串[start:stop]

其中:

参数 作用
start 起始索引(包含)
stop 结束索引(不包含)

可以理解为:

[start, stop)

也就是:

左闭右开区间


第一个切片示例

例如:

my_str = "Hello world"

print(my_str[1:4])

输出:

ell

为什么?

字符串索引如下:

字符 H e l l o 空格 w o r l d
索引 0 1 2 3 4 5 6 7 8 9 10

切片:

[1:4]

表示:

  • 从索引 1 开始(包含)
  • 到索引 4 结束(不包含)

所以得到:

e l l

即:

ell

为什么 stop 不包含?

这是初学者最容易疑惑的地方。

例如:

my_str[1:4]

很多人会认为:

应该得到:

ello

实际上不会。

因为:

Python 的切片规则是:

起始位置包含,结束位置不包含。

也就是说:

1 ✔
2 ✔
3 ✔
4 ✘

因此:

只会得到:

ell

省略 start

如果省略:

start

Python 默认:

从索引 0 开始

例如:

my_str = "Hello world"

print(my_str[:7])

输出:

Hello w

等价于:

my_str[0:7]

省略 stop

如果省略:

stop

Python 会一直切到:

字符串最后一个字符。

例如:

my_str = "Hello world"

print(my_str[8:])

输出:

rld

等价于:

my_str[8:11]

但是:

无需自己计算字符串长度。


同时省略 start 和 stop

如果两个都省略:

my_str[:]

表示:

复制整个字符串。

例如:

my_str = "Hello world"

print(my_str[:])

输出:

Hello world

通常用于:

创建字符串副本(虽然字符串本身不可变,但这种写法很常见)。


字符串切片不会修改原字符串

字符串属于:

不可变对象(Immutable)

因此:

my_str = "Hello world"

print(my_str[6:])

输出:

world

再次输出:

print(my_str)

结果:

Hello world

可以看到:

原字符串完全没有变化。

切片只是:

返回了一个新的字符串。


step(步长)

除了:

start

和:

stop

切片还支持第三个参数:

step

完整语法:

字符串[start:stop:step]

其中:

参数 作用
step 每次移动多少个字符

默认值是:

1

也就是:

一个字符一个字符地取。


每隔一个字符获取一次

例如:

my_str = "Hello world"

print(my_str[0:11:2])

输出:

Hlowrd

为什么?

因为:

步长是:

2

所以索引变化如下:

0 → 2 → 4 → 6 → 8 → 10

对应字符:

H l o w r d

最终得到:

Hlowrd

step 为负数

步长还可以写成:

-1

表示:

从后往前读取。

例如:

my_str = "Hello world"

print(my_str[::-1])

输出:

dlrow olleH

这是 Python 中最经典的字符串反转方法。

可以理解为:

最后一个字符
        ↓
倒数第二个
        ↓
……
        ↓
第一个字符

最终得到一个倒序的新字符串。


常见切片示例

假设:

text = "Python"

字符与索引:

字符 P y t h o n
索引 0 1 2 3 4 5

下面是一些常见写法:

代码 结果 说明
text[0:2] "Py" 前两个字符
text[:3] "Pyt" 从开头到索引 3(不包含)
text[2:] "thon" 从索引 2 到末尾
text[:] "Python" 整个字符串
text[::2] "Pto" 每隔一个字符取一次
text[::-1] "nohtyP" 字符串反转

常见错误

❌ 认为 stop 会包含

错误理解:

text[0:3]

得到:

Pyth

实际上输出:

Pyt

因为:

索引 3 不会包含


❌ 认为切片会修改字符串

例如:

text = "Python"

text[:3]

很多人认为:

text

变成:

Pyt

实际上:

print(text)

仍然输出:

Python

因为:

切片不会修改原字符串。


学习小结

知识点 说明
切片(Slice) 用于提取字符串中的一部分内容。
基本语法 字符串[start:stop]
左闭右开 start 包含,stop 不包含。
省略参数 start 默认从开头开始,stop 默认到字符串末尾。
step 控制每次取字符的间隔,默认为 1
[::-1] 使用负步长快速反转字符串。
不可变性 切片返回新的字符串,不会修改原字符串。

总结

  • 字符串切片(Slice)可以方便地提取字符串中的任意一段内容,语法为 字符串[start:stop:step]
  • 切片遵循左闭右开原则,即包含起始位置,不包含结束位置。
  • startstopstep 都可以省略,Python 会使用默认值,使切片写法更加灵活。
  • 使用 step 可以按固定间隔提取字符,而 [::-1] 是反转字符串最常见、最简洁的方法。
  • 由于字符串是不可变对象,因此切片不会修改原字符串,而是返回一个新的字符串。