假期第(14)天

切片
l 切片适用于列表、元组、字符串、range对象等类型,
但作用于列表时功能最强大。可以使用切片来截取列
表中的任何部分,得到一个新列表,也可以通过切片
来修改和删除列表中部分元素,甚至可以通过切片操
作为列表对象增加元素
l 切片使用2个冒号分隔的3个数字来完成:
l 第一个数字表示切片开始位置(默认为0)
l 第二个数字表示切片截止(但不包含)位置(默认为列表长
度)
l 第三个数字表示切片的步长(默认为1),当步长省略时可
以顺便省略最后一个冒号
l 切片操作不会因为下标越界而抛出异常,而是简单地
在列表尾部截断或者返回一个空列表,代码具有更强
的健壮性
序列操作6
0
6
0
切片操作
>>> aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList[::-1]
#逆序的所有元素
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
>>> aList[::2]
#偶数位置,隔一个取一个
[3, 5, 7, 11, 15]
>>> aList[1::2]
#奇数位置,隔一个取一个
[4, 6, 9, 13, 17]
>>> aList[3::]
#从下标3开始的所有元素
[6, 7, 9, 11, 13, 15, 17]
>>> aList[3:6]
#下标在[3, 6)之间的所有元素
[6, 7, 9]
>>> aList[0:100:1]
#前100个元素,自动截断
[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> aList[100:]
#下标100之后的所有元素,自动截断
[]
>>> aList[100]
#直接使用下标访问会发生越界
IndexError: list index out of range
序列操作61
6
1
切片操作——修改列表-1
l 可以使用切片来原地修改列表内容
>>> aList = [3, 5, 7]
>>> aList[len(aList):] = [9]
#在尾部追加元素
>>> aList
[3, 5, 7, 9]
>>> aList[:3] = [1, 2, 3]
#替换前3个元素
>>> aList
[1, 2, 3, 9]
>>> aList[:3] = []
#删除前3个元素
或>>> del aList[:3] #删除前3个元素
>>> aList
[9]
>>> aList = [3,5,7,9,11]
>>> del aList[::2] #删除偶数位置上的元素
>>> aList
[5, 9]
序列操作6
2
6
2
切片——修改列表-2
l 注意:使用切片修改列表元素值时,如果左侧切片是
连续的那么等号两侧的列表长度可以不一样;如果左
侧切片不连续,则右侧列表中元素个数必须与左侧相
等;使用del命令和切片删除列表中部分元素时,切
片可以不连续
>>> aList = list(range(10))
>>> aList[::2] = [0]*5
#替换偶数位置上的元素
>>> aList
[0, 1, 0, 3, 0, 5, 0, 7, 0, 9]
>>> aList[::2] = [0]*3 #切片不连续时,等号两侧不等长,抛出
异常,两边元素个数必须一样多
ValueError: attempt to assign sequence of size 3 to extended slice of
size 5
>>> x[::2] = [1, 1, 1, 1, 1] #等长,可以执行
>>> x
[1, 1, 1, 3, 1, 5, 1, 7, 1, 9]
>>> del x[::2] #可以删除列表中不连续的元素
>
>
>
x
[
1
,
3
,
5, 7, 9]
序列操
作6
3
6
3
切片操作——浅复制
l 切片返回的是列表元素的浅复制(生成一个新的列
表,并且把原列表中所有元素的引用都复制到新列
表中)如果原列表中只包含整数、实数、复数等基本
类型或元组、字符串这样的不可变类型的数据,一般
是没有问题的。
>>> aList = [3, 5, 7]
>>> bList = aList[::]
#切片,浅复制
>>> aList == bList
#两个列表的元素完全一样
True
>>> aList is bList
#但不是同一个对象
False
>>> id(aList) == id(bList)
#内存地址不一样
False
>>> bList[1] = 8
#修改其中一个不会影响另一个
>>> bList
[3, 8, 7]
>>> aList
[
3, 5, 7]
序列操作64
6
4
l 如果原列表中包含列表之类的可变数据类型,由于浅
复制时只是把子列表的引用复制到新列表中,这样的
话修改任何一个都会影响另外一个。
>>> x = [1, 2, [3,4]]
>>> y = x[:]
>>> x[0] = 5
>>> x
[5, 2, [3, 4]]
>>> y
[1, 2, [3, 4]]
>>> x[2].append(6)
>>> x
[5, 2, [3, 4, 6]]
>>> y
[1, 2, [3, 4, 6]]
切片操作——浅复制
序列操作6
5
6
5
切片操作——深复制
l 标准库copy中的deepcopy()函数实现深复制(深复制
是指对原列表中的元素进行递归,把所有的值都复制
到新列表中,对嵌套的子列表不再是复制引用。新列
表和原列表是互相独立,修改任何一个都不会影响另
外一个)
>>> import copy
>>> x = [1, 2, [3, 4]]
>>> y = copy.deepcopy(x)
#深复制
>>> x[2].append(5)
#为原列表中的子列表追加元素
>>> y.append(6)
#在新列表尾部追加元素
>>> y
[1, 2, [3, 4], 6]
>>> x
[1, 2, [3, 4, 5]]
posted @ 2022-01-14 19:28  我的未来姓栗山  阅读(24)  评论(0编辑  收藏  举报