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没有嵌套)。

参考链接

Python3 List copy()方法

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


公众号 支付宝红包码,你领红包我赚赏金;土豪请任意收钱码打赏
上一篇下一篇

猜你喜欢

热点阅读