python3 深拷貝與淺拷貝的思考和應用 --cool_soup29的學習筆記
阿新 • • 發佈:2018-12-12
深拷貝和淺拷貝是什麼? 大致理解,a = 1,b = a,淺拷貝,改變b,a隨之改變。 深拷貝,a = 1 ,b = copy.deepcopy(a), a不會隨著b的改變而改變。 更深層次的理解,則是變數是否繫結的物件的ip地址是否一致。 定義什麼的就不在此闡述了,網上很多。 在什麼情況下才能體現他們的區別? 這裡需要import copy 思考:如果在我們迴圈的條件,需要在迴圈的過程中發生了變化,則會難以的出正確的結果。 以以下程式碼為例子,暫且不論程式碼優化。 方法:cut_list() 功能實現:將一個列表切割成多個等長的列表,長度不足自成一個。由這些列表組成一個大列表。
def cut_list(L,length): page_list = [] all_list = [] bList = L # 直接=是淺拷貝,此程式碼無法實現功能 print(type(bList)) for page in L: page_list.append(bList[0]) del bList[0] if len(page_list) == length: print(page_list) all_list.append(page_list) page_list= [] if len(bList) < length: all_list.append(bList[:]) print(bList) break print(all_list) return all_list
以上程式碼無法實現功能,原因:bList淺拷貝於L,修改bList,L隨之改變 所以迴圈條件不固定。
若使用深拷貝,則功能實現,程式碼如下:
import copy as c def cut_list(L,length): page_list = [] all_list = [] bList = c.deepcopy(L) print(type(bList)) for page in L: page_list.append(bList[0]) del bList[0] if len(page_list) == length: print(page_list) all_list.append(page_list) page_list= [] if len(bList) < length: all_list.append(bList[:]) print(bList) break print(all_list) return all_list
如果錯誤,歡迎指出。