写Python时,a[1:4]这样的切片写法几乎天天见。但很多人没意识到,那个藏在方括号里的冒号语法,背后其实是一个完整的对象——slice对象。它不只是语法糖,而是可以被创建、存储、反复使用的工具。

这篇文章把切片对象的历史、用法和容易被忽略的细节串成一条线。适合写过几年Python、但还没认真看过slice()内置函数的人。

打开网易新闻 查看精彩图片

切片对象是什么

打开网易新闻 查看精彩图片

当你写data[1:4]时,Python在背后创建了一个slice对象。这个对象有三个属性:start(从哪开始)、stop(到哪结束)、step(步长)。你可以直接用slice(1, 4)手动创建它,然后像钥匙一样,插进任何支持索引的数据结构里。

代码示例很直观:

s = slice(1, 5, 2)print(s.start, s.stop, s.step)  # 输出:1 5 2data = ['a', 'b', 'c', 'd', 'e']part = slice(1, 4)print(data[part])  # 输出:['b', 'c', 'd']

关键区别在于:方括号写法是一次性的,而slice对象可以存到变量里,在多个列表上复用同一套切割规则。

扩展切片:步长的玩法

带步长的切片常被叫做"扩展切片"。a[::2]这种双冒号写法,对应的正是slice(None, None, 2)。步长为2意味着隔一个取一个;负数步长则让切片倒着走,实现列表反转。

data = [0, 1, 2, 3, 4, 5, 6]print(data[::2])  # 输出:[0, 2, 4, 6]

这里有个细节:start和stop为None时,Python会自动处理边界,不用你算列表长度。

打开网易新闻 查看精彩图片

从ALGOL到Python:切片概念的60年

切片不是Python原创。1960年的ALGOL 60最早用范围语法操作数组子集;1972年的C语言用指针算术实现类似效果,但把内存风险交给了程序员。Python在1991年的0.9.0版本引入a[start:stop]语法,2001年的Python 2.2才把切片正式变成对象,支持slice()构造函数。

后续演进值得关注:2006年NumPy引入省略号...支持多维切片;2015年Python允许自定义类通过__getitem__检测切片对象;到2025年,切片行为已稳定为内置标准。

什么时候该用slice对象

日常写脚本,方括号语法足够。但遇到两种场景,slice对象更干净:一是同一套切割规则要在多个数据源上复用;二是切割参数需要动态计算、存储或传递。比如数据管道里,把切片配置存成JSON,运行时解析成slice对象再应用——这种解耦方括号语法做不到。

切片对象的存在,体现了Python的一贯设计哲学:把常用操作变成一等公民,既保留语法简洁,又开放底层灵活性。下次写[1:4]时,你知道背后站着什么。