Python深复制与浅复制问题
2020-02-09 本文已影响0人
TTTRX
第一次遇到这个问题是在大学时期写编译原理大作业的时候遇到的。但是一直没有用心总结。后来在写野人和传教士,点灯问题求解的时候,也因为这个问题调试好长时间,浪费了很多时间。因此,今天总结一下,希望以后能避免这样的错误。
先举一个例子:
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没有嵌套)。
参考链接
欢迎大家关注我的微信公众号:
公众号 支付宝红包码,你领红包我赚赏金;土豪请任意收钱码打赏