【人生苦短,我用Python】
直入主題,在Python中,我們常常用到copy這個(gè)關(guān)鍵字,對(duì)于之前做iOS開(kāi)發(fā)的我來(lái)說(shuō)Python中的深拷貝和淺拷貝和iOS中的深淺拷貝還是有一些區(qū)別的。
淺拷貝是對(duì)于一個(gè)對(duì)象的頂層拷貝;
深拷貝是對(duì)一個(gè)對(duì)象所有層次的拷貝;
那么先來(lái)說(shuō)說(shuō)淺拷貝
如下圖1 首先定義一個(gè)單層的列表a(列表可變),使用淺拷貝得到b,打印分別得到如下內(nèi)存地址,a和b的地址是不相同的,因?yàn)閍是單層,即最外層是可變的,copy后得到的新的對(duì)象在內(nèi)存中開(kāi)辟一段新空間

接下來(lái)如下圖2 定義一個(gè)單層的元組a(元組不可變),使用淺拷貝得到b,打印分別得到如下內(nèi)存地址,a和b的地址是相同的,因?yàn)閍是單層,即最外層是不可變的,copy后得到的新的對(duì)象的指向和a指向同一段內(nèi)存空間

前兩個(gè)例子都是以單層的對(duì)象作為copy的源
如下圖3定義一個(gè)列表c,列表中包含a和b,a為可變的列表,b為不可變的元組,使用copy得到d,打印得到c和d的地址不同,c得最外層是列表(可變)copy得到的新對(duì)象與源對(duì)象指向不同的內(nèi)存空間

如下圖4定義一個(gè)元組c,c中包含可變的列表a和不可變的元組b,使用copy得到新的對(duì)象d,打印得到c和d的地址相同,d指向原內(nèi)存空間

根據(jù)以上四個(gè)例子總結(jié)淺拷貝:當(dāng)最外層對(duì)象為可變類(lèi)型時(shí),copy后得到的對(duì)象指向新的內(nèi)存空間,當(dāng)最外層的對(duì)象為不可變類(lèi)型時(shí),copy后得到的對(duì)象指向原對(duì)象的內(nèi)存空間(注意:淺拷貝的對(duì)象的最外層是否是可變類(lèi)型)
接下來(lái)說(shuō)說(shuō)深拷貝
如下圖5定義一個(gè)列表a,deepcopy得到對(duì)象b,打印a,b的地址不同

如下圖6定義一個(gè)元組a,deepcopy得到對(duì)象b,打印a,b地址相同,a,b指向同一塊地址空間

如下圖7定義一個(gè)列表c,列表中包含兩個(gè)可變類(lèi)型的元素,打印c,d的地址不同

如下圖8定義一個(gè)元組c,列表中包含兩個(gè)可變類(lèi)型的元素,打印c,d的地址不同

如下圖9定義一個(gè)元組c,列表中包含兩個(gè)不可變類(lèi)型的元素,打印c,d的地址相同

如下圖10定義一個(gè)列表c,列表中包含兩個(gè)不可變類(lèi)型的元素,打印c,d的地址不同

如上例子總結(jié):拷貝的內(nèi)容中只要有一個(gè)是個(gè)可變類(lèi)型,那么deepcopy一定是深拷貝