日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
圖解Python中深淺拷貝(copy)

在工作中,常涉及到數(shù)據(jù)的傳遞,在數(shù)據(jù)傳遞使用過程中,可能會發(fā)生數(shù)據(jù)被修改的問題。為了防止數(shù)據(jù)被修改,就需要在傳遞一個副本,即使副本被修改,也不會影響原數(shù)據(jù)的使用。為了生成這個副本,就產(chǎn)生了拷貝。今天就說一下Python中的深淺拷貝問題。

一、深淺copy

   1.  賦值運算

 
 
 
 
  1. l1 = [1, 2, 3, [22, 33]] 
  2. l2 = l1 
  3. l1.append(666) 
  4. print(l1)  # [1, 2, 3, [22, 33], 666] 
  5. print(l2)  # [1, 2, 3, [22, 33], 666]

圖解:

注意:l2 = l1是一個指向,是賦值,和深淺copy無關(guān)。

   2.  淺copy

其實列表是一個一個的槽位,每個槽位存儲的是該對象的內(nèi)存地址

 
 
 
 
  1. #例1. 給大列表添加元素 
  2. l1 = [1, 2, 3, [22, 33]] 
  3. l2 = l1.copy() 
  4. # 或者下面這種方式,也是淺copy 
  5. # import copy 
  6. # l2 = copy.copy(l1) 
  7. l1.append(666)
  8. print(l1)  # [1, 2, 3, [22, 33], 666] 
  9. print(l2)  # [1, 2, 3, [22, 33]] 
  10. #例2. 給小列表添加元素 
  11. l1 = [1, 2, 3, [22, 33]] 
  12. l2 = l1.copy() 
  13. l1[-1].append(666) 
  14. print(l1)  # [1, 2, 3, [22, 33, 666]] 
  15. print(l2)  # [1, 2, 3, [22, 33, 666]]、 
  16. 例3. 將l1列表中第一個元素改為6 
  17. l1 = [1, 2, 3, [22, 33]]
  18. l2 = l1.copy() 
  19. l1[0] = 6 
  20. print(l1)  # [6, 2, 3, [22, 33]] 
  21. print(l2)  # [1, 2, 3, [22, 33]]

圖解:

例1

例2

例3

小結(jié):

淺copy:會在內(nèi)存中新開辟一個空間,存放這個copy的列表,但是列表里面的內(nèi)容還是沿用之前對象的內(nèi)存地址。

    3.  深copy

 
 
 
 
  1. import copy 
  2. l1 = [1, 2, 3, [22, 33]] 
  3. l2 = copy.deepcopy(l1) 
  4. l1.append(666) 
  5. print(l1)  # [1, 2, 3, [22, 33], 666] 
  6. print(l2)  # [1, 2, 3, [22, 33]]

圖解:

本質(zhì)如下圖:

但是python對深copy做了一個優(yōu)化,將可變的數(shù)據(jù)類型在內(nèi)存中重新創(chuàng)建一份,而不可變的數(shù)據(jù)類型則沿用之前的,所以內(nèi)存中是下面這樣的:

小結(jié):

深copy:會在內(nèi)存中開辟新空間,將原列表以及列表里面的可變數(shù)據(jù)類型重新創(chuàng)建一份,不可變數(shù)據(jù)類型則沿用之前的。

為什么Python默認的拷貝方式是淺拷貝?

  •  時間角度:淺拷貝花費時間更少。
  •  空間角度:淺拷貝花費內(nèi)存更少。
  •  效率角度:淺拷貝只拷貝頂層數(shù)據(jù),一般情況下比深拷貝效率高。

總結(jié):

  •  不可變對象在賦值時會開辟新空間。
  •  可變對象在賦值時,修改一個的值,另一個也會發(fā)生改變。
  •  深、淺拷貝對不可變對象拷貝時,不開辟新空間,相當(dāng)于賦值操作。
  •  淺拷貝在拷貝時,只拷貝第一層中的引用,如果元素是可變對象,并且被修改,那么拷貝的對象也會發(fā)生變化。
  •  深拷貝在拷貝時,會逐層進行拷貝,直到所有的引用都是不可變對象為止。
  •  Python 有多種方式實現(xiàn)淺拷貝,copy模塊的copy 函數(shù) ,對象的 copy 函數(shù) ,工廠方法,切片等。
  •  大多數(shù)情況下,編寫程序時,都是使用淺拷貝,除非有特定的需求。
  •  淺拷貝的優(yōu)點:拷貝速度快,占用空間少,拷貝效率高。

網(wǎng)站標題:圖解Python中深淺拷貝(copy)
文章網(wǎng)址:http://www.dlmjj.cn/article/dphsdho.html