1. 程式人生 > >深淺拷貝詳解

深淺拷貝詳解

  • 直接賦值:其實就是物件的引用(別名)。

  • 淺拷貝(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 =  [ 1 2 3 4 , [ 'a' 'b' ]]  #原始物件    =  a                        #賦值,傳物件的引用 =  copy.copy(a)             #物件拷貝,淺拷貝 =  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 =   [ 1 2 3 4 , [ 'a' 'b' 'c' ],  5 ] =   [ 1 2 3 4 , [ 'a' 'b' 'c' ],  5 ] =   [ 1 2 3 4 , [ 'a' 'b' 'c' ]] =   [ 1 2 3 4 , [ 'a' 'b' ]]