1. 程式人生 > >(五)聊一聊深Copy與淺Copy

(五)聊一聊深Copy與淺Copy

otto list int print 技術分享 作用 code height 工廠

一、關於淺copy與深copy

首先說明一下:

在python中,賦值其實就是對象的引用,變量就是對象的一個標簽,如果把內存對象比喻成一個個房間,那麽變量就是門牌號。

深copy與淺copy只是針對可變類型而言,對於不可變類型,無論深淺,值相等,內存地址一樣,一旦值發生變化,相當於再創建一個對象。

淺copy有3種方法:

a=[1,2,3,["a","b"],22]

a1=a[:] 切片操作

a2=list(a) 工廠函數

a3=copy.copy(a) 或 a3=a.copy() 用copy方法

深copy:

deepcopy()方法

具體見代碼:

技術分享圖片
 1
import copy 2 a=[1,2,["a","b","c"],22,34] 3 b=a #相當於一個內存地址賦予兩個標簽a和b而已,其實a就是b,b就是a 4 print(id(a),id(b),a is b) 5 #id:2828862838856 2828862838856 返回True 6 b1=a[:]#切片拷貝,值相等,id不同,兩個內存對象 7 print(id(b1),id(a),a is b1,id(b1[0]),id(a[0]),sep="\n") 8 #id:1811258826056 1811258824776 返回False 9 #子對象地址一樣:1990094304 1990094304
10 b2=list(a) #工廠函數 11 print(id(b2),id(a)) 12 b3=copy.copy(a) 13 b4=a.copy() 14 print(id(b3)) 15 a[0]=99 16 print(id(a[0]),id(b1[0])) 17 a[2][0]="a1" #只要根中某一層子元素改變,淺copy的對象就會就改變 18 print(a,b1,b2,b3,sep="\n") 19 a[2][0]="d" 20 d=copy.deepcopy(a) 21 print(d,a) #完全獨立於a 22 #[99, 2, [‘d‘, ‘b‘, ‘c‘], 22, 34] [99, 2, [‘d‘, ‘b‘, ‘c‘], 22, 34]
View Code

總結:

1、賦值:簡單地拷貝對象的引用,兩個對象的id相同。

2、淺拷貝:創建一個新的組合對象,這個新對象與原對象共享內存中的子對象,還存在關聯。

3、深拷貝:創建一個新的組合對象,同時遞歸地拷貝所有子對象,新的組合對象與原對象沒有任何關聯。雖然實際上會共享不可變的子對象,但不影響它們的相互獨立性。

淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對於數字、字符串以及其它“原子”類型,沒有拷貝一說,產生的都是原對象的引用。

作用:深拷貝相當於備份一份

(五)聊一聊深Copy與淺Copy