Python 也能干大事,拷貝也有大學(xué)問(wèn)
淺拷貝(Shallow Copy)和深拷貝(Deep Copy)是在計(jì)算機(jī)科學(xué)中常用的兩個(gè)術(shù)語(yǔ),用于描述對(duì)象的復(fù)制操作。
淺拷貝是指創(chuàng)建一個(gè)新對(duì)象,但該新對(duì)象的一部分(如子對(duì)象)仍然與原對(duì)象共享內(nèi)存。換句話說(shuō),淺拷貝只復(fù)制了對(duì)象的引用,而沒(méi)有復(fù)制對(duì)象本身。當(dāng)原對(duì)象發(fā)生改變時(shí),淺拷貝的新對(duì)象也會(huì)受到影響。淺拷貝通常是通過(guò)復(fù)制對(duì)象的引用或引用列表來(lái)完成的。
深拷貝是指創(chuàng)建一個(gè)全新的對(duì)象,并復(fù)制原對(duì)象及其所有子對(duì)象的內(nèi)容。深拷貝將遞歸地復(fù)制原對(duì)象及其子對(duì)象,使得新對(duì)象與原對(duì)象完全獨(dú)立,不共享任何內(nèi)存。因此,當(dāng)原對(duì)象發(fā)生改變時(shí),深拷貝的新對(duì)象不會(huì)受到影響。深拷貝通常是通過(guò)遞歸復(fù)制對(duì)象及其子對(duì)象來(lái)完成的。
簡(jiǎn)單來(lái)說(shuō),淺拷貝只復(fù)制對(duì)象的引用,而深拷貝則是創(chuàng)建一個(gè)全新的對(duì)象并復(fù)制所有內(nèi)容。淺拷貝可能導(dǎo)致對(duì)象之間的關(guān)聯(lián)性,而深拷貝則消除了這種關(guān)聯(lián)性,使得新對(duì)象完全獨(dú)立于原對(duì)象。
在 Python 中,可以使用 `copy` 模塊的 `copy()` 函數(shù)進(jìn)行淺拷貝,使用 `copy` 模塊的 `deepcopy()` 函數(shù)進(jìn)行深拷貝。
在 Python 中,拷貝可以分為淺拷貝和深拷貝兩種。
淺拷貝只是將原對(duì)象的引用復(fù)制給新對(duì)象,因此新對(duì)象與原對(duì)象共享同一個(gè)內(nèi)存空間。當(dāng)原對(duì)象發(fā)生變化時(shí),新對(duì)象也會(huì)跟著發(fā)生變化。比如:
python
lst1 = [1, 2, 3]
lst2 = lst1.copy() # 淺拷貝
lst1[0] = 0
print(lst1) # 輸出 [0, 2, 3]
print(lst2) # 輸出 [1, 2, 3]
深拷貝則是將原對(duì)象完全復(fù)制一份,包括所有嵌套的對(duì)象,因此新對(duì)象與原對(duì)象不共享內(nèi)存空間。當(dāng)原對(duì)象發(fā)生變化時(shí),新對(duì)象不會(huì)受到影響。比如:
python
import copy
lst1 = [[1, 2], [3, 4]]
lst2 = copy.deepcopy(lst1) # 深拷貝
lst1[0][0] = 0
print(lst1) # 輸出 [[0, 2], [3, 4]]
print(lst2) # 輸出 [[1, 2], [3, 4]]
需要注意的是,對(duì)于不可變對(duì)象(如數(shù)字、字符串、元組等),無(wú)論是淺拷貝還是深拷貝都不會(huì)產(chǎn)生副作用,因?yàn)椴豢勺儗?duì)象不能被修改。而對(duì)于可變對(duì)象(如列表、字典等),使用淺拷貝時(shí)需要格外小心,尤其是嵌套多層的可變對(duì)象,可能會(huì)導(dǎo)致不可預(yù)期的結(jié)果。一般情況下,建議使用深拷貝來(lái)避免這種問(wèn)題。