1.1.3 数组切片

切片的基本格式是 array[start🔚step],表示对 array 在 start 到 end 之前以 step 为间隔取切片。注意这里的区间是 [start, end),也就是左闭右开。比如:

s = 'hello'
s[0:5:2]
# 表示取 s 的第 0、2、4 个字符,结果是 'hlo'

再举几个例子

s[0:5] # 不写 step 默认就是 1,因此得到 'hello'
s[1:]  # 不写 end 默认到结尾,因此得到 'ello'
s[n:]  # 获取 s 的最后 len(s) - n 个元素
s[:2]  # 不写 start 默认从 0 开始,因此得到 'he'
s[:n]  # 获取 s 的前 n 个元素
s[:-1] # 负数表示倒过来数,因此这会刨除最后一个字符,得到 'hell'
s[-2:] # 同上,表示获取最后两个字符,得到 'lo'
s[::-1]# 获取字符串的倒序排列,相当于 reverse 函数

step 和它前面的冒号要么同时写,要么同时不写,但 start 和 end 之间的冒号不能省,否则就不是切片而是获取元素了。再次强调 array[start:end] 表示的区间是 [a, b),也许你会觉得这很难记,但同样的,这会得出以下美妙的公式:

array[:n] + array[n:] = array(0 <= n <= len(array))

用代码来表示就是:

s = 'hello'
s[:2] + s[2:] == s
# True. 因为 s[:2] 是 'he',s[2:] 是 'llo'

切片不仅可以用来获取数组的一部分值,修改切片也可以直接修改数组的对应部分,比如:

a = [1, 2, 3, 4, 5, 6]
a[1:3] = [22, 33, 44]
# a = [1, 22, 33, 44, 4, 5, 6]

并没有人规定切片的新值必须也是可迭代的对象,比如这样写是不合法的:

a = [1, 2, 3, 4, 5, 6]
a[1:3] = 3
# TypeError: can only assign an iterable

Last updated