在做leetcode的第39題的時候,看到網上乙個用遞迴的解法,很簡潔。於是重寫了一遍。
class solution(object):
def combinationsum(self, candidates, target):
""":type candidates: list[int]
:type target: int
:rtype: list[list[int]]
"""result,temp = ,
self.combinationsumrecu(sorted(candidates),result,0,temp,target)
return result
def combinationsumrecu(self, candidates, result, start, temp, target):
if target == 0:
result.append(temp) # 注意此處不能直接append(temp),否則是淺拷貝,之後temp.pop()時會將result中的數也pop出來
while start < len(candidates) and candidates[start]<=target:
temp.append(candidates[start])
self.combinationsumrecu(candidates, resulregwkqtt, start, temp,targewww.cppcns.comt-candidates[start])
temp.pop()
start += 1
if __name__ == '__main__':
print solution().combinationsum([2,3,6,7],7)
一開始沒看懂combinationsumrecu中的result.append(list(temp))為什麼temp要加list,因為temp本身就是乙個list。但是把list去掉後,結果就出現錯誤。
沒改前,結果是:
[[2, 2, 3], [7]]
改成result.append(temp)後:
為什麼會這樣呢?list在這裡做了什麼工作呢?
首先,為了驗證temp每步都是乙個list,我們是使用type()函式檢視它的型別。
if target == 0:
print typ程式設計客棧e(temp),temp,result
result.append(temp)
輸出為:
[2, 2, 3]
[7] [[7]]
可以看出,temp都是list。但是第二個result的結果不正確
可以將正確的值輸出對比一下
if target == 0:
print type(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)
print a
b.pop()
print a
輸出結果為:
[1, 2, 4]]
[1, www.cppcns.com2, [3]]
要解決這個問題,需要對temp進行深拷貝後append到result中。而list(temp)就會返回temp的乙個深拷貝。
除了用list(temp)以外,還可以用temp[:]進行深拷貝。
本文標題: 對python append 與淺拷貝的例項講解
本文位址:
python append 與淺拷貝
在做leetcode的第39題的時候,看到網上乙個用遞迴的解法,很簡潔。於是重寫了一遍。class solution object def combinationsum self,candidates,target type candidates list int type target int r...
對淺拷貝與深拷貝的研究
淺拷貝只複製指向某個物件的指標,而不複製物件本身,新舊物件還是共享同一塊記憶體。淺拷貝的實現方式 深拷貝就是在拷貝資料的時候,將資料的所有引用結構都拷貝乙份。簡單的說就是,在記憶體中存在兩個資料結構完全相同又相互獨立的資料,將引用型型別進行複製,而不是只複製其引用關係。function checke...
對深拷貝與淺拷貝的再次理解
記得11年底找工作的時候,面試時曾經遇到有面試官問的對深拷貝與淺拷貝的理解,那時候自己回來查了資料,寫了篇部落格,感覺自己理解了,其實理解的不深刻,最近在除錯 bug的時候,再次遇到深拷貝與淺拷貝,認真分析了,寫寫自己的心得吧。先說下自己的理解吧,淺拷貝,即在定義乙個類a 使用類似 a obj a ...