Python之深淺拷貝

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Python之深淺拷貝

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站制作、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的信豐網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

一、淺拷貝

所謂淺拷貝,指的是對于某個對象,雖然創(chuàng)建了與該對象具有相同值的另一個對象,但是,這兩個對象內(nèi)部嵌套的對應子對象全都是同一個對象。簡單地說,外部進行了拷貝,內(nèi)部沒有拷貝。

以下方式得到的拷貝都是淺拷貝:

● 切片操作[:]

● 調(diào)用列表、字典、集合的方法copy()

● 調(diào)用內(nèi)置函數(shù)List()、dict()、set(4.

● 調(diào)用標準庫模塊copy中的函數(shù)copy()

import?copy??#?導入標準庫模塊copy
L1?=?[1,[1,2,3],6]
L2?=?L1.copy()?#?[1,?[1,?2,?3],?6]?使用list.copy()
L2?=?L1[:]?#?[1,?[1,?2,?3],?6]?#?使用索引切片的方式
L2?=?list(L1)?#??[1,?2,?3],?6]?#?使用list()函數(shù)賦值
L2?=?copy.copy(L1)?#?[1,?[1,?2,?3],?6]??#?調(diào)用標準庫模塊copy中的函數(shù)copy()

#?通過打印L1和L2的id可以看出,L2只拷貝了L1的外部,形成了一個和L1具有相同值的對象
#?L1和L2內(nèi)部值的id全都相同,即引用的同一內(nèi)存地址
print('L1_id:%d'?%?id(L1))?#?L1_id:140024932419056
print('L2_id:%d'?%?id(L2))?#?L2_id:140024932419456
print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:140024932419376
print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:140024932419376
print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466624
print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624

#?淺拷貝,對于列表內(nèi)部嵌套的可變類型對象,修改L1[1][1]值,L2[1][1]值也會跟著改變
#?實際上他們內(nèi)部都引用著同一個內(nèi)存id
L1[1][1]?=?5
print(L1)?#?[1,?[1,?5,?3],?6]
print(L2)?#?[1,?[1,?5,?3],?6]
print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:140024932419376
print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:140024932419376

#?淺拷貝,對于列表內(nèi)部的不可變類型對象,修改L1[2],
#?因為是不可變類型,那么會重新調(diào)用一個值給予引用,L2[2]因此不受影響
L1[2]?=?8
print(L1)?#?[1,?[1,?5,?3],?8]
print(L2)?#?[1,?[1,?5,?3],?6]
print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466688
print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624

二、深拷貝

所謂深拷貝,指的是:對于某個對象,創(chuàng)建與該對象具有相同值的另一個對象,同時,這兩個對象內(nèi)部嵌套的對應可變子對象全都不是同一個對象。簡單地說,外部和內(nèi)部都進行了拷貝。

深拷貝的方法:

● 調(diào)用標準庫模塊copy中的函數(shù)deepcopy()

import?copy??#?導入標準庫模塊copy
L1?=?[1,[1,2,3],6]
L2?=?copy.deepcopy(L1)?#?[1,?[1,?2,?3],?6]

#?通過打印L1和L2的內(nèi)存地址可以看出,其外部進行拷貝,L2是和L1具有相同值的新對象
#?對于內(nèi)部嵌套的可變類型對象,L1[1]和L2[1]內(nèi)存地址并不相同
#?對于內(nèi)部嵌套的不可變類型對象,L1[2]和L2[2]內(nèi)存地址相同,引用的同一內(nèi)存地址
print('L1_id:%d'?%?id(L1))?#?L1_id:139984573203792
print('L2_id:%d'?%?id(L2))?#?L2_id:139984573203952
print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:139984573203472
print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:139984573204512
print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466624
print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624

#?深拷貝,列表內(nèi)部嵌套的可變類型對象,修改L1[1][1]?為5不影響L2[1][1]的值,
#?深拷貝是將L1和L2內(nèi)部可變類型對象的值引用的內(nèi)存地址分開來
L1[1][1]?=?5
print(L1)?#?[1,?[1,?5,?3],?6]
print(L2)?#?[1,?[1,?2,?3],?6]
print('L1[1]_id:%d'?%?id(L1[1]))?#?L1[1]_id:139984573203472
print('L2[1]_id:%d'?%?id(L2[1]))?#?L2[1]_id:139984573204512

#?深拷貝,對于列表內(nèi)部不可變類型對象,修改L1[2]?=?8,因為是不可變類型,所以將L1[2]重新賦值引用,不影響L2[2]
L1[2]?=?8
print(L1)?#?[1,?[1,?5,?3],?8]
print(L2)?#?[1,?[1,?2,?3],?6]
print('id_L1[2]?%d'?%?id(L1[2]))?#?id_L1[2]?9466688
print('id_L2[2]?%d'?%?id(L2[2]))?#?id_L2[2]?9466624

本文名稱:Python之深淺拷貝
分享URL:http://www.muchs.cn/article42/gehchc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、做網(wǎng)站、品牌網(wǎng)站制作ChatGPT、手機網(wǎng)站建設定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司