對python append 與淺拷貝的例項講解

2022-10-03 13:15:13 字數 2001 閱讀 3977

在做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 ...