Python切片语法为[start:end:step],三者均可省略(留空),但不可填None或字符串;step为0抛ValueError,负步长时默认start/end反转,字符串切片只读,列表切片可原地修改。

切片语法怎么写:[start:end:step] 三个位置都不能省略成空字符串
Python切片不是“从哪到哪”这么简单,start、end、step 都是可选的,但省略时写法有严格规则:只能留空,不能填 None 或字符串。比如 lst[1::2] 合法,lst[1:None:2] 虽然语义等价但极少这么写,且在某些静态检查工具里会报 warning。
常见错误现象:lst[1, 5, 2](逗号分隔)直接报 SyntaxError;或者误以为 lst[:5:0] 是“取前5个”,其实 step=0 会抛出 ValueError: slice step cannot be zero。
-
start缺省 → 从开头(0或-len(lst))开始 -
end缺省 → 到末尾(len(lst)或-1)结束(注意:不包含该索引) -
step缺省 → 默认为1,负值表示反向遍历
字符串和列表切片行为一致,但修改字符串会报 TypeError
切片返回新对象,这点对 list 和 str 都成立。区别在于:列表支持就地修改,字符串不可变。所以 s = "abc"; s[0] = "x" 报错,但 s[0:2] 没问题;而 l = [1,2,3]; l[0:2] = ["x","y"] 是合法的原地替换操作。
使用场景:想“截断并替换”一段内容时,别对字符串用切片赋值——根本走不通。该用 s.replace()、f"{s[:i]}new{s[j:]}" 或正则。
立即学习“Python免费学习笔记(深入)”;
- 字符串切片只读,返回新字符串,内存开销与长度成正比
- 列表切片也返回新列表,但若后续要修改,不如用
del或pop避免多余拷贝 - 两者索引越界不报错:
"hello"[10:20]返回空字符串,[1,2][10:20]返回空列表
step=-1 反转时,start 和 end 的默认值会“掉个儿”
这是最容易踩坑的地方:正向切片默认 start=0、end=len(obj);但 step 为负时,默认 start=-1(最后一个元素)、end=-len(obj)-1(越过开头)。所以 s[::-1] 才能完整反转,而不是 s[: : -1](一样)或 s[0:-1:-1](返回空字符串)。
性能影响:反转本身是 O(n),但如果你写成 s[-1::-1],虽然结果对,却多算一次索引映射,无必要。
-
s[4:1:-1]→ 取索引 4、3、2(不含 1),即s[4]+s[3]+s[2] -
s[1:4:-1]→ 空字符串,因为起始位置在终止位置“左边”,且步长为负,无法前进 - 用
reversed()做迭代器更省内存,但不支持随机访问;切片返回实体对象
嵌套结构切片没用,得靠循环或 numpy
Python 原生列表不支持二维切片语法,matrix[1:3][0:2] 是先取子列表再切,不是真正意义上的“行+列”切片。它不会报错,但逻辑常被误解——比如你以为在取左上 2×2 子矩阵,实际可能拿到的是两行中各自前两个元素组成的两个新列表。
使用场景:处理 CSV 行列、图像像素、表格数据时,别硬套原生切片。小数据可用列表推导:[row[1:3] for row in matrix[1:3]];大数据建议换 numpy.array,支持 arr[1:3, 1:3] 这种真二维切片。
-
list[list]是常见误用模式,性能差且语义模糊 -
numpy切片返回 view(视图),修改会影响原数组;原生切片永远是 copy - 如果只是临时提取几列,
zip(*matrix)转置后切更直观
step 符号切换时的边界逻辑、嵌套结构的“假二维”陷阱、还有字符串不可变带来的赋值限制,这几个点稍不留神就会绕半天。










