閱讀934 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go  免費OA係統選型報告--OA辦公係統界麵篇
  下一篇:go  JSP在網頁中顯示的問題