Python 切片(Slicing)语法详解
Python 切片语法 seq[start:end:step]:start 含、end 不含、step 步长;负值从尾部计数。本文详解切片规则、常用示例和常见误区。
切片语法 seq[start:end:step]:取 start(含)到 end(不含)的元素,step 为步长。任何部分都可省略;负数表示从尾部倒数。适用于列表、字符串、元组等所有序列。
基本形式
a = [0, 1, 2, 3, 4, 5]
a[1:4] # [1, 2, 3]——下标 1 到 3(end 不含)
a[2:] # [2, 3, 4, 5]——从下标 2 到末尾
a[:3] # [0, 1, 2]——从头到下标 2
a[:] # [0, 1, 2, 3, 4, 5]——整个列表的浅拷贝
步长
a[::2] # [0, 2, 4]——隔一个取一个
a[1::2] # [1, 3, 5]
a[::-1] # [5, 4, 3, 2, 1, 0]——反转
负索引(从尾部数)
a[-1] # 5——最后一个元素
a[-2:] # [4, 5]——最后两个
a[:-1] # [0, 1, 2, 3, 4]——去掉最后一个
常用场景速查
| 需求 | 写法 |
|---|---|
| 前 N 个 | a[:N] |
| 后 N 个 | a[-N:] |
| 去掉首尾 | a[1:-1] |
| 浅拷贝 | a[:] 或 a.copy() |
| 反转 | a[::-1] |
| 每隔 k 个 | a[::k] |
友好特性
- 越界不报错:
a[0:100]自动截断到末尾; - start > end 不报错:返回空序列;
- 字符串、元组同样适用(返回同类型新对象)。
常见问题(FAQ)
Q:a[:] 和 a.copy() 一样吗?
A:对列表都是浅拷贝——新列表但元素还是原引用。嵌套列表要深拷贝用 copy.deepcopy()。
Q:切片能赋值吗?
A:能。a[1:3] = [9, 9, 9] 替换区间元素,长度可以不一致(原列表会被伸缩)。
Q:为什么 end 不包含?
A:Edsger Dijkstra 的经典设计:end - start 正好等于切片长度,a[:n] + a[n:] 正好拼回原序列。