更新時間:2023-12-28 來源:黑馬程序員 瀏覽量:
在Python中,copy和deepcopy都是用于復(fù)制對象的方法,但它們之間有著重要的區(qū)別。
copy方法創(chuàng)建了一個新的對象,并將原始對象的元素(對于可變對象,是其引用)復(fù)制到新對象中。這意味著對于不可變對象,copy產(chǎn)生的是原始對象的副本,而對于可變對象,則復(fù)制了對象的引用。對于可變對象,如果對原始對象進(jìn)行了更改,新對象也會受到影響。
import copy # 不可變對象(int) original_int = 5 copied_int = copy.copy(original_int) print(original_int) # 輸出: 5 print(copied_int) # 輸出: 5 # 改變原始對象的值 original_int = 10 print(original_int) # 輸出: 10 print(copied_int) # 輸出: 5(副本不受影響) # 可變對象(list) original_list = [1, 2, 3] copied_list = copy.copy(original_list) print(original_list) # 輸出: [1, 2, 3] print(copied_list) # 輸出: [1, 2, 3] # 改變原始對象 original_list.append(4) print(original_list) # 輸出: [1, 2, 3, 4] print(copied_list) # 輸出: [1, 2, 3, 4](因為復(fù)制的是引用,副本也受到影響)
deepcopy方法也創(chuàng)建了一個新的對象,但它會遞歸復(fù)制原始對象及其內(nèi)部所有可變對象的內(nèi)容,而不僅僅是引用。這樣,即使原始對象的內(nèi)容發(fā)生變化,深拷貝后的對象也不會受到影響。
import copy # 可變對象(list)的嵌套 original_nested_list = [1, [2, 3], 4] deep_copied_list = copy.deepcopy(original_nested_list) print(original_nested_list) # 輸出: [1, [2, 3], 4] print(deep_copied_list) # 輸出: [1, [2, 3], 4] # 修改原始對象內(nèi)部的嵌套列表 original_nested_list[1][0] = 5 print(original_nested_list) # 輸出: [1, [5, 3], 4](原始對象改變) print(deep_copied_list) # 輸出: [1, [2, 3], 4](深拷貝對象不受影響)
總結(jié)來說,copy只復(fù)制了對象的引用,因此對于可變對象來說,如果原始對象發(fā)生變化,副本也會相應(yīng)變化。而deepcopy則會遞歸復(fù)制整個對象結(jié)構(gòu),即使對象內(nèi)部嵌套了其他可變對象,也能完全獨(dú)立復(fù)制,從而確保深拷貝后的對象不受原始對象變化的影響。