Python 切片(Slicing)语法详解

Python 切片语法 seq[start:end:step]:start 含、end 不含、step 步长;负值从尾部计数。本文详解切片规则、常用示例和常见误区。

最佳实践
Python 切片(Slicing)语法详解封面

切片语法 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 个(N非负) a[-N:] if N else [],避免N=0返回全部
去掉首尾 a[1:-1]
浅拷贝 a[:] 或 a.copy()
反转 a[::-1]
每隔 k 个 a[::k]

友好特性

  • 越界不报错:a[0:100] 自动截断到末尾;
  • start > end 不报错:正步长常返回空,负步长可正常选取反向区间;step不能为0;
  • 字符串、元组同样适用(通常返回同类型序列,不可变对象的完整切片可能复用原对象,不能保证新身份)。

常见问题(FAQ)

Q:a[:] 和 a.copy() 一样吗?
A:对列表都是浅拷贝——新列表但元素还是原引用。嵌套列表要深拷贝用 copy.deepcopy()。

Q:切片能赋值吗?
A:能。a[1:3] = [9, 9, 9] 替换区间元素,长度可以不一致(原列表会被伸缩);扩展切片 step 不为1时,赋值长度必须与被选元素数一致。

Q:为什么 end 不包含?
A:Edsger Dijkstra 的经典设计:当step=1、0≤start≤end≤len(a)时,end-start才等于切片长度;越界会截断,start>end时为空,a[:n] + a[n:] 正好拼回原序列。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台