什么是字符串切片(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]。 - 切片遵循左闭右开原则,即包含起始位置,不包含结束位置。
start、stop和step都可以省略,Python 会使用默认值,使切片写法更加灵活。- 使用
step可以按固定间隔提取字符,而[::-1]是反转字符串最常见、最简洁的方法。 - 由于字符串是不可变对象,因此切片不会修改原字符串,而是返回一个新的字符串。