Python 直接賦值、淺拷貝和深度拷貝全解析
阿新 • • 發佈:2017-11-18
ima img 引入 對象的引用 print function 引用 輸出結果 ons
-
直接賦值:其實就是對象的引用(別名)。
-
淺拷貝(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 是一個獨立的對象,但他們的子對象還是指向統一對象(是引用)。
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‘ ]])
|
Python 直接賦值、淺拷貝和深度拷貝全解析