-
直接賦值:其實就是對象的引用(別名,其實就是一個人今天叫張三 明天叫張狗子的意思)。
-
淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。
-
深拷貝(deepcopy):?copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子對象。
list深度拷貝。?
? ? ?下面是引用兩個作者的內容 附上鏈接
https://www.cnblogs.com/huangbiquan/archive/2017/11/06/7795152.html
?1.賦值: 只是復制了新對象的引用,不會開辟新的內存空間。
? 2.淺拷貝: 創建新對象,其內容是原對象的引用。
? ? 淺拷貝有三種形式:切片操作,工廠函數,copy模塊中的copy函數。
? ? 如: lst = [1,2,3,[4,5]]?
? ? 切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst]
? ? 工廠函數:lst1 = list(lst)
? ? copy函數:lst1 = copy.copy(lst)
es6對象深拷貝。?
? ? 淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在lst中有一個嵌套的list[4,5],如果我們修改了它,情況就不一樣了。
?
? 3.深拷貝:只有一種形式,copy模塊中的deepcopy函數。
? ? ?和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。
? ? ?深拷貝出來的對象是一個全新的對象,不再與原來的對象有任何關聯。
>>> import copy >>> a = [1,2,3,4,['a','b']] #定義一個列表a >>> b = a #賦值 >>> c = copy.copy(a) #淺拷貝 >>> d = copy.deepcopy(a) #深拷貝>>> a.append(5) >>> print(a) [1, 2, 3, 4, ['a', 'b'], 5] #a添加一個元素5 >>> print(b) [1, 2, 3, 4, ['a', 'b'], 5] #b跟著添加一個元素5 >>> print(c) [1, 2, 3, 4, ['a', 'b']] #c保持不變 >>> print(d) [1, 2, 3, 4, ['a', 'b']] #d保持不變>>> a[4].append('c') >>> print(a) [1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])添加一個元素c >>> print(b) [1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟著添加一個元素c >>> print(c) [1, 2, 3, 4, ['a', 'b', 'c']] #c跟著添加一個元素c >>> print(d) [1, 2, 3, 4, ['a', 'b']] #d保持不變#說明如下: #1.外層添加元素時, 淺拷貝c不會隨原列表a變化而變化;內層list添加元素時,淺拷貝c才會變化。 #2.無論原列表a如何變化,深拷貝d都保持不變。 #3.賦值對象隨著原列表一起變化
Python 直接賦值、淺拷貝和深度拷貝解析
復制拷貝指針的數據?https://www.cnblogs.com/alinh/p/6603976.html
-
直接賦值:其實就是對象的引用(別名)。
-
淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。
-
深拷貝(deepcopy):?copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子對象。
拷貝函數和賦值?字典淺拷貝實例
實例
1 2 3 4 5 6 7 | >>>a? = ?{ 1 : [ 1 , 2 , 3 ]} >>> b? = ?a.copy() >>> a, b ({ 1 : [ 1 ,? 2 ,? 3 ]}, { 1 : [ 1 ,? 2 ,? 3 ]}) >>> a[ 1 ].append( 4 ) >>> a, b ({ 1 : [ 1 ,? 2 ,? 3 ,? 4 ]}, { 1 : [ 1 ,? 2 ,? 3 ,? 4 ]}) |
深度拷貝需要引入 copy 模塊:
實例
1 2 3 4 5 6 7 | >>> import ?copy >>> c? = ?copy.deepcopy(a) >>> a, c ({ 1 : [ 1 ,? 2 ,? 3 ,? 4 ]}, { 1 : [ 1 ,? 2 ,? 3 ,? 4 ]}) >>> a[ 1 ].append( 5 ) >>> a, c ({ 1 : [ 1 ,? 2 ,? 3 ,? 4 ,? 5 ]}, { 1 : [ 1 ,? 2 ,? 3 ,? 4 ]}) |
解析
鏈表的深度拷貝。1、b = a:?賦值引用,a 和 b 都指向同一個對象。
2、b = a.copy():?淺拷貝, a 和 b 是一個獨立的對象,但他們的子對象還是指向統一對象(是引用)。
python 淺拷貝、3、b = copy.deepcopy(a):?深度拷貝, a 和 b 完全拷貝了父對象及其子對象,兩者是完全獨立的。
更多實例
以下實例是使用 copy 模塊的 copy.copy( 淺拷貝 )和(copy.deepcopy ):
實例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/bin/python # -*-coding:utf-8 -*- ? ?import ?copy a? = ?[ 1 ,? 2 ,? 3 ,? 4 , [ 'a' ,? 'b' ]]? #原始對象 ? ?b? = ?a??????????????????????? #賦值,傳對象的引用 c? = ?copy.copy(a)???????????? #對象拷貝,淺拷貝 d? = ?copy.deepcopy(a)???????? #對象拷貝,深拷貝 ? ?a.append( 5 )????????????????? #修改對象a a[ 4 ].append( 'c' )???????????? #修改對象a中的['a', 'b']數組對象 ? ?print (? 'a = ' , a ) print (? 'b = ' , b ) print (? 'c = ' , c ) print (? 'd = ' , d ) |
拷貝函數?以上實例執行輸出結果為:
1 2 3 4 | ( 'a = ' , [ 1 ,? 2 ,? 3 ,? 4 , [ 'a' ,? 'b' ,? 'c' ],? 5 ]) ( 'b = ' , [ 1 ,? 2 ,? 3 ,? 4 , [ 'a' ,? 'b' ,? 'c' ],? 5 ]) ( 'c = ' , [ 1 ,? 2 ,? 3 ,? 4 , [ 'a' ,? 'b' ,? 'c' ]]) ( 'd = ' , [ 1 ,? 2 ,? 3 ,? 4 , [ 'a' ,? 'b' ]]) |
?