切片

切片(Slicing) 是对序列类型(如 liststrtuple 等)进行区间访问的一种方式。
它允许你通过索引区间提取部分元素,而不修改原序列。

基本语法:

1
seq[start:end:step]
参数 含义 默认值
start 起始索引(包含) 0
end 结束索引(不包含) 序列长度
step 步长 1

基础操作

1
2
3
4
5
6
nums = [0, 1, 2, 3, 4, 5]

print(nums[1:4]) # [1, 2, 3] 取索引 1~3 的元素
print(nums[:3]) # [0, 1, 2] 省略 start,默认为0
print(nums[3:]) # [3, 4, 5] 省略 end,取到结尾
print(nums[:]) # [0, 1, 2, 3, 4, 5] 复制整个列表

负索引

在 Python 中,索引可以为负数,表示从序列末尾开始计数

索引 含义
-1 最后一个元素
-2 倒数第二个元素
-3 倒数第三个元素

📘 示例:

1
2
3
4
5
nums = [10, 20, 30, 40, 50]

print(nums[-1]) # 50
print(nums[-2]) # 40
print(nums[-3]) # 30

🔁 负索引 + 切片

1
2
3
4
5
nums = [10, 20, 30, 40, 50]

print(nums[-3:]) # [30, 40, 50] 从倒数第三个开始到末尾
print(nums[:-2]) # [10, 20, 30] 去掉最后两个
print(nums[-4:-1]) # [20, 30, 40]

👉 注意:切片的“方向”由 步长 step 决定,而不是索引的正负。

切片步长

step 参数控制切片的“跳跃”间隔和方向。

正步长

从左到右取:

1
2
3
nums = [0, 1, 2, 3, 4, 5]
print(nums[::2]) # [0, 2, 4] 每隔一个取一个
print(nums[1::2]) # [1, 3, 5] 从索引1开始,每隔一个取一个

负步长

step 为负数时,表示从右向左反向取值,此时必须保证 start > end 才能取到结果。

1
2
3
4
nums = [0, 1, 2, 3, 4, 5]

print(nums[::-1]) # [5, 4, 3, 2, 1, 0] 完全反转
print(nums[4:1:-1]) # [4, 3, 2] 从索引4到索引2

解释:start = 4 → 从值 4 开始,end = 1 → 取到索引 2step = -1 → 每次向左取一个

高级应用

切片不只是“取值”用的,还可以进行以下操作:

修改部分内容

1
2
3
nums = [0, 1, 2, 3, 4, 5]
nums[2:5] = [20, 30, 40]
print(nums) # [0, 1, 20, 30, 40, 5]

删除部分元素

1
2
3
nums = [0, 1, 2, 3, 4, 5]
del nums[1:4]
print(nums) # [0, 4, 5]

插入新元素

切片替换时长度可变:

1
2
3
nums = [1, 2, 3]
nums[1:1] = [100, 200]
print(nums) # [1, 100, 200, 2, 3]

字符串切片

字符串虽然不能修改,但可以切片得到新字符串:

1
2
3
4
s = "Python"
print(s[1:4]) # "yth"
print(s[::-1]) # "nohtyP" 反转字符串
print(s[-3:]) # "hon"

边界行为

Python 的切片非常宽容,不会抛出越界错误:

1
2
3
4
nums = [1, 2, 3, 4]

print(nums[0:100]) # [1, 2, 3, 4] 超出范围也不会报错
print(nums[-100:3]) # [1, 2, 3] 同理

这种“安全边界”是切片的优势之一。

底层原理

当你写:

1
nums[start:end:step]

Python 实际上会创建一个 slice 对象

1
2
slice_obj = slice(start, end, step)
result = nums[slice_obj]

你甚至可以手动创建 slice 对象:

1
2
3
s = slice(1, 5, 2)
nums = [0, 1, 2, 3, 4, 5]
print(nums[s]) # [1, 3]

总结表

功能 示例 说明
基础切片 a[1:4] 索引1~3
省略参数 a[:3], a[2:] 默认起点或终点
步长 a[::2] 每隔一个取一个
负步长 a[::-1] 反向取值
负索引 a[-3:-1] 倒数第3到倒数第2
修改切片 a[1:3] = [9,9] 替换部分内容
删除切片 del a[:2] 删除部分内容
slice对象 a[slice(1,5,2)] 等价写法