<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖解 Python 中深淺拷貝(copy)

          共 1672字,需瀏覽 4分鐘

           ·

          2021-03-01 13:00

          作者:南枝向暖北枝寒MA? ? ? ?原文鏈接

          https://blog.csdn.net/mall_lucy/article/details/104531218

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


          一、深淺copy


          1. 賦值運算

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

          圖解:



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


          1. 淺copy


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

          #例1. 給大列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()# 或者下面這種方式,也是淺copy# import copy# l2 = copy.copy(l1)l1.append(666)
          print(l1) # [1, 2, 3, [22, 33], 666]print(l2) # [1, 2, 3, [22, 33]]
          #例2. 給小列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[-1].append(666)
          print(l1) # [1, 2, 3, [22, 33, 666]]print(l2) # [1, 2, 3, [22, 33, 666]]、
          例3. 將l1列表中第一個元素改為6l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[0] = 6
          print(l1) # [6, 2, 3, [22, 33]]print(l2)??#?[1,?2,?3,?[22,?33]]

          圖解:


          例1



          例2



          例3



          小結(jié):


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


          1. 深copy

          import copyl1 = [1, 2, 3, [22, 33]]l2 = copy.deepcopy(l1)l1.append(666)print(l1)  # [1, 2, 3, [22, 33], 666]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默認(rèn)的拷貝方式是淺拷貝?


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

          總結(jié):


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

          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久亚洲AV成人无码电影 | 欧美在线视频一区 | 椎名空一区二区三区无码观看 | 国模视频网 | 国产精品污 |