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 个 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:] 正好拼回原序列。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台