引子:深拷貝與淺拷貝是Python面中非常常見(jiàn)的考題策菜,很多小伙伴對(duì)這個(gè)知識(shí)點(diǎn)一直是云里霧里睦尽,往往在面試中就栽在這個(gè)地方脏答,那么今天就請(qǐng)你花上幾分鐘的時(shí)間好好的閱讀這篇文章碗暗,相信從此以后就再也不擔(dān)心面試官在這類問(wèn)題上難倒你了镀娶。
首先立膛,我們來(lái)看看最簡(jiǎn)單的一種情況:
從上面的例子中我們可以看出,a和b的地址是一樣的梯码,說(shuō)明兩者指向同一個(gè)對(duì)象宝泵,也就是說(shuō)通過(guò)將a賦值給b僅僅是將a的地址拷貝給b,而沒(méi)有將a的內(nèi)容拷貝給b轩娶,這就是典型的淺拷貝的定義儿奶,用圖來(lái)表示如下:
即a和b指向同一個(gè)對(duì)象,僅僅是用了不同的變量名而已鳄抒。
接下來(lái)闯捎,我們?cè)賮?lái)看看另外一種淺拷貝的情況:
上面的例子如果用圖來(lái)表示的話就是這樣的:
這種情況下,雖然d在拷貝c之后许溅,d和c的id地址不一樣瓤鼻,但是d并沒(méi)有重新拷貝c中的a和b的內(nèi)容,也就是d中的a和b仍然指向的是原來(lái)的a和b贤重,所以當(dāng)在原始的a列表中增加一個(gè)元素時(shí)茬祷,相應(yīng)的c和d中的a的內(nèi)容也會(huì)發(fā)生改變。這種情況是對(duì)于c和d是可變類型(列表)而言的并蝗,當(dāng)c和d是不可變類型(例如元組)時(shí)祭犯,又會(huì)是什么情況呢秸妥?我們接下來(lái)試驗(yàn)一下:
可以發(fā)現(xiàn),當(dāng)c和d是不可變類型時(shí)(元組)沃粗,兩者通過(guò)copy拷貝之后粥惧,內(nèi)容和地址都是一樣的。以上內(nèi)容都是淺拷貝的例子最盅,接下來(lái)我們?cè)倏纯瓷羁截惖睦樱?/p>
可以發(fā)現(xiàn)通過(guò)deepcopy拷貝之后和a的id地址發(fā)生了變化突雪,用圖來(lái)表示的話如下:
c將a的內(nèi)容重新拷貝了一份,因此無(wú)論a再發(fā)生什么變化涡贱,也不會(huì)影響c的值了挂签,這就是深拷貝。
接下來(lái)盼产,我們?cè)賮?lái)看看稍微復(fù)雜的例子:
用圖來(lái)表示如下:
對(duì)比上面的淺拷貝圖4,我們就可以發(fā)現(xiàn)不一樣的地方勺馆,e中的a和b相當(dāng)于是重新拷貝了一份a和b的內(nèi)容戏售,所以如果修改原來(lái)a中的內(nèi)容,并不影響e中的內(nèi)容的改變草穆,這一點(diǎn)讀者可以自己試驗(yàn)一下灌灾。在此就不細(xì)贅了。
結(jié)語(yǔ):以上就是本篇文章的主要內(nèi)容悲柱,希望對(duì)各位讀者有所幫助锋喜。