Python學習筆記之淺拷貝和深拷貝
在Python中對象的複製有三種一般的複製,淺拷貝,深拷貝,那麼他們有什麼區別呢
一般的複製
#encoding:utf-8 #定義一個嵌套集合 lista=[1,2,3,[4,5,6,[7,8,9]]] listb=lista #分別打印出 lista和listb的地址值 print id(lista) #4511103096 print id(listb) #4511103096 #修改lista中的內容,listb中的內容也會跟著修改 lista[0]=0 print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]] print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
通過以上實踐會發現,複製操作就是將lista在內存中指向的地址,也讓listb指向他,本身並沒有在內存中創建地址。
如果你想學習Python可以來這個群,首先是四七二,中間是三零九,最後是二六一,裏麵可以免費的學習和交流,也有學習資料可以下載。
淺拷貝
#encoding:utf-8 #定義一個嵌套集合 import copy lista=[1,2,3,[4,5,6,[7,8,9]]] #使用copy模塊中copy方法 listb=copy.copy(lista) print id(lista) #4396231640 print id(listb) #4396231712 #發現lista和listb在內存中的地址有區別, #打印元素中的第一個元素的地址值 print id(lista[0])#140666751466536 print id(listb[0])#140666751466536 #元素的地址值是一樣的,是不是意思就是,改變lista中的第一個元素, # listb中的也要改變呢 lista[0]=0 print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]] print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] #結果發現,竟然沒有跟著lista一起改變,為什麼呢,因為使用了淺拷貝唄 #我們在打印下lista[0]和listb[0]的地址 print id(lista[0]) #140666751466560 print id(listb[0]) #140666751466536 #會發現lista[0]重新指向內存中的其他地址 #這時候可以通過以上的方法,修改lista[3],lista[3]也是一個list print id(lista[3])#4499779240 print id(listb[3])#4499779240 #修改lista[3]中第一個元素呢 lista[3][0]=0 print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]] print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]] #發現修改lista[3][0]元素的值,listb[3][0]也會跟著改變
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
根據以上實踐說明,淺拷貝對對象中對象沒有拷貝。
深拷貝
#encoding:utf-8 #定義一個嵌套集合 import copy lista=[1,2,3,[4,5,6,[7,8,9]]] #深拷貝功能是在淺拷貝上做的加強,所以具備淺拷貝的功能 listb=copy.deepcopy(lista) lista[3][0]=0 print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]] print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] #深拷貝會解決修改lista[3][0]值不會影響listb中的值 #再來修改下第三層列表中元素是不是也完成拷貝 lista[3][3][0]=0 print lista #[1, 2, 3, [0, 5, 6, [0, 8, 9]]] print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] #沒有受到任何影響
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
最後更新:2017-07-15 20:33:44