Python切片步长语法详解:start:stop:step的含义与默认值

Aria
Aria
发布时间:2026-11-13 | 5人浏览过
原创

详细讲解Python切片语法中start、stop、step三个参数的含义、默认值规则,以及正负步长的实际用法,配合完整示例帮助理解切片机制。

Python中对序列(列表、字符串、元组等)进行切片的完整语法是 sequence[start:stop:step]。三个参数分别控制切片的起点、终点和步长。掌握它们各自的含义,尤其是省略时的默认值规则,是灵活使用切片的关键。本文将逐一拆解这三个参数,配合具体示例说明各种组合下的行为。

一、切片语法的基本结构

切片表达式写在方括号内,使用冒号分隔三个部分:

sequence[start:stop:step]

三个参数的作用如下:

  • start:切片开始的索引位置(包含该位置的元素)。
  • stop:切片结束的索引位置(不包含该位置的元素)。
  • step:每次跳跃的间隔,即从当前元素到下一个元素之间跨过几个位置。

这三个参数都可以省略。省略时Python会根据step的方向自动填入合理的默认值,这正是初学者容易搞混的地方。在详细讲解默认值之前,先通过一个具体例子建立直观认识:

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

nums[2:7:2]    # 从索引2开始,到索引7之前,每隔2个取一个

输出示例:

[2, 4, 6]

这里start=2表示从索引2(值为2)开始,stop=7表示到索引7(值为7)之前停下,step=2表示每次前进2个位置,因此依次取到索引2、4、6对应的元素。

Python切片步长语法详解:start:stop:step的含义与默认值
图1:nums[2:7:2] 的取值过程——从索引2出发,每次跳2步,在索引7前停止

二、start参数:从哪里开始

start指定切片的起始索引,切片结果包含该索引处的元素。

当start为正数时,从序列左端开始计算位置。当start为负数时,从序列末尾往前计算,例如-1表示最后一个元素,-3表示倒数第三个。

s = "ABCDEFGH"

s[3:]      # 从索引3开始到末尾

输出示例:

'DEFGH'
s[-3:]     # 从倒数第3个开始到末尾

输出示例:

'FGH'

省略start时的默认值:取决于step的方向。step为正(或省略)时,start默认为0,即从序列开头开始;step为负时,start默认为-1,即从序列末尾开始。这个规则保证了切片总是沿step的方向有内容可取。

三、stop参数:在哪里结束

stop指定切片的结束边界,切片结果不包含该索引处的元素。这个"左闭右开"的设计是Python切片的核心特征之一。

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

nums[2:5]    # 包含索引2、3、4,不包含索引5

输出示例:

[2, 3, 4]

stop同样支持负数索引。nums[1:-2] 表示从索引1取到倒数第2个元素之前:

nums[1:-2]

输出示例:

[1, 2, 3, 4, 5, 6, 7]

省略stop时的默认值:同样取决于step的方向。step为正时,stop默认为序列长度(即取到末尾最后一个元素);step为负时,stop默认为序列开头之前(即取到第一个元素)。

为什么stop不包含在内?这样设计有两个好处:一是 len(sequence[a:b]) 等于 b - a(在无步长时),长度直观可算;二是相邻切片可以无缝拼接,例如 s[:3] 和 s[3:] 刚好覆盖整个序列,中间不重叠也不遗漏。

四、step参数:每次跨多远

step决定了遍历方向和间隔。step为正数时从左往右取,step为负数时从右往左取。

正步长

step=1是默认行为,逐个取元素。step=2表示每隔一个元素取一个,step=3表示每隔两个取一个,以此类推。

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

nums[::2]    # 从头到尾,每隔一个取一个
nums[1::2]   # 从索引1开始,每隔一个取一个

输出示例:

[0, 2, 4, 6, 8]
[1, 3, 5, 7, 9]

负步长

step为负数时,切片方向反转——从较大的索引向较小的索引方向移动。最常用的场景是 [::-1] 反转序列:

s = "Hello"
s[::-1]

输出示例:

'olleH'

使用负步长时,start应大于stop(或者让它们的默认值生效),否则切片结果为空:

nums[7:2:-1]    # 从索引7向索引2方向,每次后退1步

输出示例:

[7, 6, 5, 4, 3]
nums[2:7:-1]    # start < stop 但step为负,方向矛盾,结果为空

输出示例:

[]

省略step时的默认值:step默认为1,即逐个向右取元素。step不能为0,否则Python会抛出 ValueError: slice step cannot be zero。

Python切片步长语法详解:start:stop:step的含义与默认值
图2:正步长从左往右选取元素,负步长从右往左选取元素

五、默认值规则汇总

三个参数省略时的默认值并不是固定的,而是根据step的正负动态决定。下面用一张表完整列出:

参数 step > 0 时默认值 step < 0 时默认值
start 0(序列开头) -1(序列末尾)
stop len(seq)(末尾之后) 序列开头之前(含第一个元素)
step 1

几个典型的省略写法:

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

nums[:]      # 省略全部,等价于 nums[0:10:1],复制整个列表
nums[::3]    # 省略start和stop,start=0, stop=10, step=3
nums[::-2]   # step=-2, start默认为-1, stop默认为开头之前

输出示例:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 3, 6, 9]
[9, 7, 5, 3, 1]

理解这个规则后,[::-1] 反转序列的原理就很清楚了:step=-1使start默认为末尾、stop默认为开头之前,于是从最后一个元素逐个往前取,直到取完第一个元素。

Python切片步长语法详解:start:stop:step的含义与默认值
图3:省略start或stop时,Python根据step的正负自动选择默认值

六、负索引与切片的配合

Python的负索引可以直接用在切片的start和stop中。-1代表最后一个元素,-2代表倒数第二个,以此类推。负索引与切片搭配使用时非常方便,特别适合从序列尾部取数据。

data = [10, 20, 30, 40, 50, 60, 70, 80]

data[-4:]       # 取最后4个元素
data[-6:-2]     # 从倒数第6个到倒数第2个之前
data[-1:-4:-1]  # 从最后一个往前取3个

输出示例:

[50, 60, 70, 80]
[30, 40, 50, 60]
[80, 70, 60]

需要注意的是,当使用负步长且指定了stop时,stop的含义仍然是"不包含"。data[-1:-4:-1] 中stop=-4对应值40,最终结果取到值60为止,不包含40。

七、切片不会越界

与直接索引不同,切片不会因为start或stop超出序列范围而报错。Python会自动将越界的值截断到序列边界:

short = [1, 2, 3]

short[0:100]     # stop远超长度,自动截断到3
short[-100:2]    # start远超负方向,自动截断到0
short[10:20]     # start就已经越界,结果为空列表

输出示例:

[1, 2, 3]
[1, 2]
[]

这个特性让切片非常安全——不需要事先检查序列长度就可以放心使用。

八、常见实用场景

复制序列

new_list = old_list[:] 创建一个浅拷贝,修改new_list不会影响old_list。这等价于 old_list[0:len(old_list):1]。

反转序列

reversed_str = my_str[::-1] 是反转字符串最简洁的写法。对列表同样有效,但如果不需要新列表,list.reverse() 方法原地反转更省内存。

隔行采样

处理数据时经常需要隔行取值:rows[::2] 取偶数行(索引0、2、4…),rows[1::2] 取奇数行(索引1、3、5…)。

截取固定长度

text[:50] 安全地截取前50个字符,即使text不足50个字符也不会报错。

去掉首尾元素

items[1:-1] 去掉第一个和最后一个元素,常用于去除边界标记或表头表尾。

Python切片步长语法详解:start:stop:step的含义与默认值
图4:Python切片三参数要点总结与常用切片速查

九、使用切片对象

当同一个切片模式需要反复使用时,可以用内置的 slice() 函数创建一个切片对象,然后传给方括号:

every_other = slice(None, None, 2)   # 等价于 [::2]
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

nums[every_other]

输出示例:

[0, 2, 4, 6, 8]

slice(start, stop, step) 的三个参数与方括号语法一一对应。用 None 代替省略的参数。切片对象还提供 .indices(length) 方法,返回经过边界处理后的 (start, stop, step) 三元组,这在实现自定义序列类的 __getitem__ 时非常有用。

小结

Python切片的 start:stop:step 三个参数分别控制起点、终点和步长。记住三条核心规则即可灵活使用:stop位置的元素不包含在结果中(左闭右开);省略的参数默认值由step的正负决定,保证切片方向有内容可取;切片不会越界报错,超出范围自动截断。正步长从左到右遍历,负步长从右到左遍历,[::-1] 是最常见的反转写法。掌握这些规则后,各种切片表达式都可以用同一套逻辑推导出结果。

相关专题:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表