Python中list的深复制与浅复制

浅复制与深复制

通俗易懂的说,
浅复制,指生成一个新的列表,并且把原列表中所有元素的引用都复制到新列表中。(新旧列表相互影响)
深复制,指生成一个新的列表,把所有的值都复制到新列表中,对嵌套的子列表不再是复制引用。(新旧列表相互独立)

list的浅复制

1、直接把一个列表变量赋值给另一个变量

a_list=['apple','banana','pear']
b_list=a_list
a_list.append('peach')
print("a_list is",a_list)
print("b_list is",b_list)

输出:
1
可以看到,对列表1做修改,同样会作用与列表2
2、使用切片赋值

a_list=['apple','banana','pear']
b_list=a_list[:]
a_list.append('peach')
print("a_list is",a_list)
print("b_list is",b_list)

输出:
2
这里,修改一个列表的值,不会影响另一个列表的值。
但如果有子列表的嵌套,就会出现不同的结果。

a_list=['apple',['banana','lemon'],'pear']
b_list=a_list[:]
a_list.append('peach')
print("a_list is",a_list)
print("b_list is",b_list)
a_list[1].append('durian')
print("a_list is",a_list)
print("b_list is",b_list)
a_list[1]='watermelon'
print("a_list is",a_list)
print("b_list is",b_list)

输出:
在这里插入图片描述可以看到,对于a_list列表中嵌套子列表的元素进行修改,同样会作用与b_list。
而如果直接将嵌套的子列表,作为一个整体,直接修改为另一个值,则不会影响b_list。

所以使用切片复制,只会在第一层实现深复制,对第二层或更深的层只是实现了浅复制。(这仍然属于浅复制)

这是为什么呢?
其实切片的功能类似于for循环,通过for循环的复制,可以很容易明白切片实现一层复制的原因。下面我们用for循环实现复制:

a_list=['apple',['banana','lemon'],'pear']
b_list=[]
for a in a_list:
	b_list.append(a)
a_list.append('peach')
print("a_list is",a_list)
print("b_list is",b_list)
a_list[1].append('durian')
print("a_list is",a_list)
print("b_list is",b_list)
a_list[1]='watermelon'
print("a_list is",a_list)
print("b_list is",b_list)

输出:
在这里插入图片描述可以看到,和使用切片复制的结果一模一样。
在一般情况下,append(x)函数,会直接将变量x的值追加至列表尾,但是如果变量x为一个列表,那它会将x的引用(地址)追加到列表中,所以复制以后,b_list[1]的值为一个引用,修改列表x的值会影响b_list的值。

3、copy()
该函数会直接返回列表的浅复制

a_list=['apple',['banana','lemon'],'pear']
b_list=a_list.copy()
a_list.append('peach')
print("a_list is",a_list)
print("b_list is",b_list)
a_list[1].append('durian')
print("a_list is",a_list)
print("b_list is",b_list)
a_list[1]='watermelon'
print("a_list is",a_list)
print("b_list is",b_list)

输出:
在这里插入图片描述
使用copy的作用与使用切片相同,只会在第一层实现深复制,对第二层或更深的层只是实现了浅复制。

list的深复制

使用deepcopy()函数(注意要导入copy的包,且使用上也有所变化)

import copy
a_list=['apple',['banana','lemon'],'pear']
b_list=copy.deepcopy(a_list)
a_list.append('peach')
print("a_list is",a_list)
print("b_list is",b_list)
a_list[1].append('durian')
print("a_list is",a_list)
print("b_list is",b_list)

输出在这里插入图片描述现在,无论做什么,a_list都无法影响到b_list了。
但是,运行真的很慢,使用copy,切片之类的0.1s就足够了,这个却非常的慢。
当然我又多运行了几次,大多时候还是1s完成。不过网上查阅,确实深度复制影响效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值