Python - 列表切片 与 深拷贝、浅拷贝

发布时间 2024-01-05 16:18:46作者: 虎头小黑

1.列表list常用的方法:

lst = [1,2,3]

# append(new_item)方法相当于在列表末尾追加一个元素,相当于 lst[len: ] = new_item
lst.append(4)
print(lst)

# extend(iterable) 方法,将iterable中的每个元素逐个添加到列表中,
# 相当于 lst[len: len + len(iterable)] = iterable
lst.extend({7,8,9})
print(lst)

 

2.列表切片Slice:

#lst[start,  end,  scale]
# start 和 end 表示列表索引范围区间,左开右闭
# scale表示间隔步长,不管scale正负,切片取值依次为:start,start+scale, ...
slice1 = lst[1, 5, 2]
print(slice1)

# 切片索引值缺省
# start 默认0, end默认len,scale默认1
slice2 = lst[::]  #等价于 slice2 = lst[0:len(list):1]

list的切片是深拷贝,会生成一个副本,不会影响原列表

 

3. 深拷贝与浅拷贝

  Python解释器为了节省内存空间,如果多个变量为不可变对象且变量的值相同,则这多个变量会指向同一个内存空间,这个内存空间中存储了变量的值。

lst = [1,2, ['a', 'b', 'c']]

#浅拷贝列表
lst1 = lst.copy()
lst1[0] = 11
lst1[2][0] = 'aaa'
print(lst)

# 深拷贝列表
import copy
lst2 = copy.deepcopy(lst)
lst2[2][1] = 'bbb'
print(lst)

浅拷贝:对不可变对象进行浅拷贝,不会开辟新内存;对可变对象(如列表)进行浅拷贝:当lst经过浅拷贝生成lst1时,lst和lst1本身指向的地址不同,但是两个列表中元素的引用是相同的,不管列表元素类型是可变类型还是不可变类型。因此,对于浅拷贝的两个列表 lst 和 lst1:当修改lst1中的不可变对象时,lst列表不会改变;当修改lst1中的可变对象lst1[2]的内容时,lst列表也会随之修改。

 

深拷贝:对不可变对象进行深拷贝,不会开辟新内存;对不可变对象中包含可变元素如元组(1, 2, ['a', 'b']),深拷贝后元组中的可变类型元素也会开辟新内存;对可变对象(如列表)进行深拷贝:当lst经过深拷贝生成lst2时,lst和lst2本身的执行的地址不同,并且对于被拷贝列表lst,其中的可变类型元素以及可变类型元素中的嵌套的可变类型元素等,都会开辟新内存。这样造成的结果就是:对于深拷贝对象lst2,不论lst2的元素怎么改动,都不会影响到原被拷贝对象lst。