Python 深复制与浅复制的认真总结

第一次遇到这个问题是在大学时期写编译原理大作业的时候遇到的。但是一直没有用心总结。后来在写野人和传教士,点灯问题求解的时候,也因为这个问题调试好长时间,浪费了很多时间。因此,今天总结一下,希望以后能避免这样的错误。
先举一个例子:

def change(aList):
    for i in range(len(aList)):
        aList[i]+=1
    print(aList)

theList=[[1]]
a=theList[0]
change(a)
print(theList)

其输出为:

[2]
[[2]]

可以看出,一旦将theList中的一个元素(该元素也是一个List)赋值给a,那么a的改变,theList也会同时随之改变,同时,theList的改变也会影响到a
那么如何解决这个问题呢:用copy函数!
再看一份代码:

def change(aList):
    for i in range(len(aList)):
        aList[i]+=1
    print(aList)

theList=[[1]]
a=theList[0]
change(a)
print(theList)
b=theList[0].copy()
change(b)
print(theList)

输出是:

[2]
[[2]]
[3]
[[2]]

可以看出,b的改变并未影响theList
再来看一份例子:

theList=[[1]]
a=theList
a[0][0]+=1
print(theList)
b=theList.copy()
b[0][0]+=1
print(theList)

输出是:

[[2]]
[[3]]

可见,如果list元素也是list的话,即使在最顶层copy还是会相互影响。解决办法就是:

theList=[[1]]
a=theList
a[0][0]+=1
print(theList)
b=[]
for item in theList:
    b.append(item.copy())
b[0][0]+=1
print(theList)

输出:

[[2]]
[[2]]

总结

使用=直接赋值,是引用赋值,更改一个,另一个同样会变, 例子中的a,b改变两次都影响到了对方
copy() 则顾名思义,复制一个副本,原值和新复制的变量互不影响

另外,使用copy函数进行浅复制,必须是在list的元素不再是list的情况下才奏效(list没有嵌套)。

参考链接

Python3 List copy()方法

欢迎大家关注我的微信公众号:
公众号

支付宝红包码,你领红包我赚赏金;土豪请任意收钱码打赏

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值