1つの授業はpythonの中で最もよく質問する問題の一つを徹底的に理解させます.△三好さんはもうノートを出してまじめに授業をしてノートを取りました.


まず、私たちが理解しなければならないのは、深浅複製が何なのか&何をしているのかということです.
例えば、砂糖紙と砂糖があり、深い複製は砂糖紙と砂糖に相当し、浅い複製は砂糖紙だけである.△この言葉は心に刻んで、本文を読んでから繰り返し推測して、もし深い心得があれば--おめでとうございます:pythonの深い複製をしっかりと把握しています!)

                         ?                            
      id(object),        “    ”( c++          ),     。

  , is           ,      id 。
id       ,               

1.導入-pythonでの付与=
割り当て操作を直接実行し、以下を観察します.
a = [1,2,3,4]
b = a
id(a)
id(b)    #   a b id    

リストaを変更してから観察します.
a.append(4)
id(a)
id(b)    #   a b id     ,     。

これによりコピーは可能であるが、aを変更してもbを変更しても、最終的にはaとbが変更される.
        :
             ,        ,         。          ,         ,      。

2.pythonでの深浅コピーを正式に説明する
注意:濃淡レプリケーションは、ネストされたリスト(辞書でも使用できます)でのみ機能します.li=[1,2,3,4]のような単層リストであれば,深さレプリケーションのidと元のリストのidは異なり,元のリストを修正しても深さレプリケーションのリストは変わらない.△次の説明を読むと、この文の原理を深く理解することができます.
(1)簡単なコピー説明:
直接コードをつけて、时間は真理を検査する唯一の标准です!!!
                                                                    #     ,  id()            
li = [1,2,3]                                                         print(id(li))190679494 1256                                                      
li2 = li.copy() 													 print(id(li2))190679493 8824 
print(li is li2)	#    false                                                                                                                          
print(li2)  	    #     li  (      !)   

観察により、複製前と複製後のliとli 2のidは異なる(すなわち、liとli 2がコンピュータ内部を指すのは同じ空間ではない)が、liとli 2は同じであることが分かった.liまたはli 2を変更すると、他のものには影響しません.実質:コンピュータ内の要素の位置を変更せず、表層のみをコピーできます.たとえば、数です.
  :         
       :       ,       li     ,
(             ,      )         (    )

(2)説明を深くコピーする:
深いレプリケーションを使用するには、モジュールをインポートします.
import copy                                                                                                     
  :                        copy.deepcopy

直接コードにアクセスする--時間は真理を検証する唯一の基準です!

import copy 
a = [1,2,3,4]                                                          
a2 = copy.deepcopy(a)                                              
print(id(a))
print(id(a2))
print(a is a2)

観察から,複製前と複製後のaとa 2のidは異なり,aとa 2は同じであることが分かった.
(3)両者の比較:
両者の違い:浅いレプリケーション:その最も外側のレイヤをコピーして、リストをネストして、中のこのレイヤは元のメモリアドレスを指しています.深いコピー:完全にすべてコピーして、元のリストとは関係ありません.理解を深めるために、次の2つの実戦例(1つの単層リスト、1つのネストリスト)を詳しく説明します.
3.深浅な複製について詳しく説明する.
(1)単層リストの場合:
くだらないことは言わない--直接コードをつけて、时間は真理を検証する唯一の基準です!!!
import copy

li = [1,2,3]

li1 = copy.copy(li)
li2 = copy.deepcopy(li)

観察により、liとli 1とli 2の3つのリストは完全に同じである.ただしidが表示するアドレスは異なるので、liの後ろにappend(5)がある場合、浅いコピーと深いコピーのリストli 1とli 2は変わらない.ネストされたリストでない場合は、深さのコピーに違いはありません.ネストされたリストを導入するには:
(2)ネストリスト:
              ,         :
li = [1,2,3,4,[5,6,[7,8]]]       li       。
   [1,2,3,4]   :         (    )
   [5,6]       :         
   [7,8]       :               

くだらないことは言わない--直接コードをつけて、时間は真理を検証する唯一の基準です!!!
li = [[1,2],[3,4]]
li2 = li                    #li2   
li3 = copy.copy(li)         #li3    
li4 = copy.deepcopy(li)     #li4    

#   li,li2,li3,li4      ,    [[1,2],[3,4]]

次に、この4つのリストのidを見てみましょう.
id(li)       2011597308424
id(li2)      2011597308424
id(li3)      2011597308360 
id(li4)      2011598772872

#      li2    li id    ,        id     id   

元のリストの一番後ろに数字を付けると、4つのリストのidは変わりません.
考えを変えてみましょう(ネストされたリストであることに注意してください)
id(li[0])2011597305032
id(li2[0])2011597305032
id(li3[0])2011597305032
id(li4[0])2011598772936

以上より,ネストリストでは,浅いレプリケーションが元のメモリアドレスを指し,深いレプリケーションが新しいメモリ空間アドレスを指すと結論した.ネストされたリストでなければ、深いレプリケーションは新しい空間を指します.深浅コピー注意:ネストリストとネストリストでない場合!!!

      
      ,    ,     ,           ,       !

元のリストの最初のレイヤのネストに要素を追加します(コードは次のとおりです!)、解析:
li[0].append(5)      

メモリ空間アドレスが同じなので、liとli 2、li 3は追加されます.しかしli 4は追加しないで、メモリの空間がすべて異なったためです!!!
4.今回の授業のまとめ(急いであなたのノートを出してメモしてください!)
 、     (    /  ):              ,                 ,    id  。
                       ,               。        id     。

 、         copy          ,                      ,        。    id        ,id         。
               (      ,    ),           ;                     ,                    。
 、         deepcopy()           ,                     。
            ,                。

     :  python   !
a = 1
b = 1
id(a)1402582080
id(b)1402582080

python         ,                    ,
         ,                  。