python列表的切片操作可以通过指定起始索引、结束索引和步长三个参数,灵活获取列表中的部分元素,不同的参数组合对应不同的切片形式,下面逐一介绍常见的几种切片形式。

1. 基础完整切片形式
基础切片需要指定起始索引start和结束索引stop,语法为list[start:stop],切片结果包含start索引对应的元素,不包含stop索引对应的元素,索引从0开始计数。
# 定义一个测试列表 test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 获取索引1到索引4的元素,包含索引1,不包含索引4 result = test_list[1:4] print(result) # 输出 [2, 3, 4]
2. 带步长的切片形式
带步长的切片在基础切片的基础上增加步长参数step,语法为list[start:stop:step],表示每隔step-1个元素取一个值,步长默认为1,步长为正数时从左向右取值。
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 从索引0开始,到索引7结束,每隔1个元素取一个值,即步长为2 result = test_list[0:7:2] print(result) # 输出 [1, 3, 5, 7]
3. 反向切片形式
当步长为负数时,切片会从右向左取值,此时起始索引需要大于结束索引,否则会返回空列表,这种形式常用于获取反转后的列表或者从后向前取值。
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 步长为-1,从索引8开始到索引3结束,从右向左取值 result = test_list[8:3:-1] print(result) # 输出 [9, 8, 7, 6, 5] # 反转整个列表 reverse_list = test_list[::-1] print(reverse_list) # 输出 [9, 8, 7, 6, 5, 4, 3, 2, 1]
4. 省略参数的切片形式
切片操作中三个参数都可以省略,不同的省略方式对应不同的取值逻辑,具体规则如下:
- 省略
start:默认从列表第一个元素开始取值,即start=0 - 省略
stop:默认取到列表最后一个元素,包含最后一个元素 - 省略
step:默认步长为1
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 省略start和stop,步长为1,获取整个列表 result1 = test_list[:] print(result1) # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9] # 省略stop,从索引2开始取到最后 result2 = test_list[2:] print(result2) # 输出 [3, 4, 5, 6, 7, 8, 9] # 省略start,取到索引5之前的元素 result3 = test_list[:5] print(result3) # 输出 [1, 2, 3, 4, 5] # 省略start和stop,步长为2 result4 = test_list[::2] print(result4) # 输出 [1, 3, 5, 7, 9]
5. 索引越界的切片形式
列表切片操作允许起始索引和结束索引超出列表的实际长度,不会出现索引越界错误,超出部分会被自动忽略,按照实际存在的元素范围取值。
test_list = [1, 2, 3, 4, 5] # 结束索引超出列表长度,实际取到列表最后一个元素 result = test_list[2:10] print(result) # 输出 [3, 4, 5] # 起始索引超出列表长度,返回空列表 result2 = test_list[10:12] print(result2) # 输出 []
不同切片形式对比
下面通过表格总结不同切片形式的特点和适用场景:
| 切片形式 | 语法示例 | 特点 | 适用场景 |
|---|---|---|---|
| 基础切片 | list[1:4] | 指定起止范围,左闭右开 | 获取连续的一段元素 |
| 带步长切片 | list[0:7:2] | 可控制取值间隔 | 间隔取值、跳选元素 |
| 反向切片 | list[8:3:-1] | 步长为负,从右向左取值 | 反转列表、从后向前取值 |
| 省略参数切片 | list[:5] | 参数可灵活省略,有默认取值 | 快速取前N个、后N个元素 |
| 越界切片 | list[2:10] | 不会报错,自动忽略越界部分 | 不确定列表长度时取值 |
注意事项
切片操作返回的是一个新的列表对象,不会修改原列表,这一点和通过索引修改元素不同。如果原列表后续被修改,不会影响已经通过切片得到的新列表。
test_list = [1, 2, 3, 4, 5] slice_result = test_list[1:3] # 修改原列表 test_list[1] = 100 print(test_list) # 输出 [1, 100, 3, 4, 5] print(slice_result) # 输出 [2, 3],不受原列表修改影响