1. 程式人生 > >python3 深拷貝與淺拷貝的思考和應用 --cool_soup29的學習筆記

python3 深拷貝與淺拷貝的思考和應用 --cool_soup29的學習筆記

深拷貝和淺拷貝是什麼? 大致理解,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

如果錯誤,歡迎指出。