对python append 与浅拷贝的实例讲解
在做Leetcode的第39题的时候,看到网上一个用递归的解法,很简洁。于是重写了一遍。
classSolution(object): defcombinationSum(self,candidates,target): """ :typecandidates:List[int] :typetarget:int :rtype:List[List[int]] """ result,temp=[],[] self.combinationSumRecu(sorted(candidates),result,0,temp,target) returnresult defcombinationSumRecu(self,candidates,result,start,temp,target): iftarget==0: result.append(temp)#注意此处不能直接append(temp),否则是浅拷贝,之后temp.pop()时会将result中的数也pop出来 whilestart一开始没看懂combinationSumRecu中的result.append(list(temp))为什么temp要加list,因为temp本身就是一个list。但是把list去掉后,结果就出现错误。
没改前,结果是:
[[2,2,3],[7]]
改成result.append(temp)后:
[[],[]]
为什么会这样呢?list在这里做了什么工作呢?
首先,为了验证temp每步都是一个list,我们是使用type()函数查看它的类型。
iftarget==0: printtype(temp),temp,result result.append(temp)输出为:
[2,2,3][] [7][[7]] 可以看出,temp都是list。但是第二个result的结果不正确
可以将正确的值输出对比一下
iftarget==0: printtype(temp),temp,result result.append(list(temp))输出为:
[2,2,3][] [7][[7]] 可以看出,本来第二个result应该为[[2,2,3]],结果变成了[[7]].
于是猜想可能是append()浅拷贝问题。
append(temp)后又在后面进行temp.pop()操作。result实际上append的是temp的引用。当temp所指向的地址的值发生改变时,result也会跟着改变。
举个例子验证一下:
a=[1,2] b=[3,4] a.append(b) printa b.pop() printa输出结果为:
[1,2,[3,4]] [1,2,[3]]要解决这个问题,需要对temp进行深拷贝后append到result中。而list(temp)就会返回temp的一个深拷贝。
除了用list(temp)以外,还可以用temp[:]进行深拷贝。
以上这篇对pythonappend与浅拷贝的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。