久久久精品2019免费观看_亚洲国产精品成人久久久_69国产成人综合久久精品91_国产精品久久精品视

Python 深拷貝是什么

上章我們講完了淺拷貝,這章我們來講深拷貝!

我還是把上章的l1復(fù)制下來,還是用這個(gè)列表來講。

講深拷貝我們就需要使用別人給我們寫到的功能了,語法也很簡單。

直接寫一個(gè)import,就是倒入的意思,‘import copy’。

導(dǎo)入別人寫好的這個(gè)copy功能模塊這個(gè)copy模塊下面還有一個(gè)功能叫deepcopy。這是別人寫好的功能,我們直接拿來用就好了。

我們直接先來打印一下l3,結(jié)果確實(shí)是拷貝成功了,內(nèi)容和l1是一樣的。

我們接下來看l1和拷貝的l3它們的id是否一樣。打印出來兩個(gè)id完全不一樣。說明l3就是一個(gè)新的列表。

上章我們講過了如果列表里面含有可變類型,淺拷貝是沒有辦法完全區(qū)分開的,現(xiàn)在我們來看深拷貝是否能夠區(qū)分開。

我還是把上章打印列表內(nèi)部元素id的代碼直接拿過來用,我們來看看深拷貝之后的列表內(nèi)部到底是否還是直接使用原有的內(nèi)存地址。

從打印的結(jié)果我們發(fā)現(xiàn)前面兩個(gè)不可變類型的id號(hào)是一樣的,但是后面的字列表這個(gè)可變類型的id號(hào)變了,再來看圖。

前面兩個(gè)不可變類型的id號(hào)沒變,說明指向的還是原來的值,上章講淺拷貝的時(shí)候也說了,如果列表存的是不可變類型新列表改動(dòng)之后都是產(chǎn)生新的值,根本不會(huì)影響到原列表。

所以說這兩個(gè)不可變類型仍然指向的是原來的值,這是合理的,因?yàn)槿绻悴桓?,那我就用同一個(gè)值,這樣更節(jié)省內(nèi)存空間。

如果你仍然要改,那我就給你產(chǎn)生新的值,申請(qǐng)新的內(nèi)存空間就行了。

但是針對(duì)可變類型深拷貝和淺拷貝就不一樣了,深拷貝針對(duì)可變類型會(huì)產(chǎn)生新的內(nèi)存地址關(guān)鍵是新產(chǎn)生的這個(gè)字列表,它里面存的數(shù)據(jù),是用原值還是產(chǎn)生的新值?

我們來打印一下l1的2號(hào)索引也就是這個(gè)字列表,看它的第一個(gè)元素的id號(hào)和第二個(gè)元素的id號(hào),再來看l3的這個(gè)新字列表的第一個(gè)元素的id號(hào)和第二個(gè)元素的id號(hào)。我們發(fā)現(xiàn)這兩個(gè)不可變類型任然是實(shí)用的原值。

講到這里我們就明白了,深拷貝針對(duì)的容器類型會(huì)產(chǎn)生新的容器,針對(duì)不可變類型則任然會(huì)使用原值,這樣更加節(jié)省內(nèi)存空間。

然后我們來修改一下l3,還是把上章的代碼復(fù)制過來,打印一下看。l1還是原來的數(shù)據(jù),l3則是完全被我改掉了。

結(jié)果就是這樣,兩者的數(shù)據(jù)是完全獨(dú)立的,沒有任何交集。如果你想要拷貝一個(gè)列表,并且想讓拷貝的列表和原列表完全獨(dú)立開,就一定要用深拷貝。

未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » Python 深拷貝是什么

贊 (0) 打賞

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

微信掃一掃打賞