在学习Python中,有一个概念很多人都会提到:切片,下面我谈谈对切片的理解;
注意:本主题不谈切片的参数含义,以及对序列数据的处理操作逻辑(这是很多人做过的事情)。
一、 [ ]下标(subscript)运算符与切片(slice)
- 什么是切片(slice)?
下标运算是下标运算,切片与切片。这两个概念被很多人混淆了。只是在Python内置的[ ]运算符内置支持切片而已。
什么是切片,Python专门提供了切片类型,切片是Python的一种数据类型,并提供切片语法来表达这种数据类型。
s = slice(0,5,-1)
官方文档中提供slice的帮助:
class slice(object)
| slice(stop)
| slice(start, stop[, step])
|
| Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).
|
- 怎么使用切片?
Python提供两种切片使用方式,但是本质都一样:
| - 对象方式,
| - 内置切片语法方式,
- 使用切片语法
a = [1,2,3,4]
print(a[0:3:1])
- 使用切片对象
a = [1,2,3,4]
s = slice(0,3,1)
print(a[s])
- 说明
- 下标运算支持切片;
- 下标运算作用于元组,列表,字典等多种结构类型,下标是被所有对象支持的,但不是所有对象的[]下标运算中都实现切片的逻辑,比如字典类型(其内部判定使用了切片,会抛出异常)。(下标常有,切片不常有,切片的语法搭配下标使用的独特语法[存在使用局限],也可以单独使用对象)
- 切片内置语法,最终也是转换为切片对象使用。
二、在下标运算符[ ]重载中使用切片
class A:
def __getitem__(self, item):
print(item)
def __setitem__(self, key, value):
print(key,value)
a = A()
a[1]
a[1] = 30
a[1:2:1]
输出结果:
1
1 30
slice(1, 2, 1)

重载下标运算符适用切片
三、结论
- 下标是下标,切片是切片;
- 下标中使用一个参数的才是真正的下标,表示地址偏移。在重载中是一个整数参数。
- 使用了切片运算符号,会自动装箱为slice切片对象。如果不使用
:就不是切片。
切片的语法是在下标中使用合法,并且是语法格式是start:stop:stride,切片的运算数是三个,都是可选的。默认值都是None,None的含义,由下标[ ]运算符的实现决定。
a[:] # slice(None, None, None)
a[::] # slice(None, None, None)
附录:
在Python提供不少的自动装箱的语法规则,其中*与**就是参数装箱与解箱的语法操作。
Python真是一个实用的语言。