1つの授業はpythonの中で最もよく質問する問題の一つを徹底的に理解させます.△三好さんはもうノートを出してまじめに授業をしてノートを取りました.
13727 ワード
まず、私たちが理解しなければならないのは、深浅複製が何なのか&何をしているのかということです.
例えば、砂糖紙と砂糖があり、深い複製は砂糖紙と砂糖に相当し、浅い複製は砂糖紙だけである.△この言葉は心に刻んで、本文を読んでから繰り返し推測して、もし深い心得があれば--おめでとうございます:pythonの深い複製をしっかりと把握しています!)
1.導入-pythonでの付与=
割り当て操作を直接実行し、以下を観察します.
リストaを変更してから観察します.
これによりコピーは可能であるが、aを変更してもbを変更しても、最終的にはaとbが変更される.
2.pythonでの深浅コピーを正式に説明する
注意:濃淡レプリケーションは、ネストされたリスト(辞書でも使用できます)でのみ機能します.li=[1,2,3,4]のような単層リストであれば,深さレプリケーションのidと元のリストのidは異なり,元のリストを修正しても深さレプリケーションのリストは変わらない.△次の説明を読むと、この文の原理を深く理解することができます.
(1)簡単なコピー説明:
直接コードをつけて、时間は真理を検査する唯一の标准です!!!
観察により、複製前と複製後のliとli 2のidは異なる(すなわち、liとli 2がコンピュータ内部を指すのは同じ空間ではない)が、liとli 2は同じであることが分かった.liまたはli 2を変更すると、他のものには影響しません.実質:コンピュータ内の要素の位置を変更せず、表層のみをコピーできます.たとえば、数です.
(2)説明を深くコピーする:
深いレプリケーションを使用するには、モジュールをインポートします.
直接コードにアクセスする--時間は真理を検証する唯一の基準です!
観察から,複製前と複製後のaとa 2のidは異なり,aとa 2は同じであることが分かった.
(3)両者の比較:
両者の違い:浅いレプリケーション:その最も外側のレイヤをコピーして、リストをネストして、中のこのレイヤは元のメモリアドレスを指しています.深いコピー:完全にすべてコピーして、元のリストとは関係ありません.理解を深めるために、次の2つの実戦例(1つの単層リスト、1つのネストリスト)を詳しく説明します.
3.深浅な複製について詳しく説明する.
(1)単層リストの場合:
くだらないことは言わない--直接コードをつけて、时間は真理を検証する唯一の基準です!!!
観察により、liとli 1とli 2の3つのリストは完全に同じである.ただしidが表示するアドレスは異なるので、liの後ろにappend(5)がある場合、浅いコピーと深いコピーのリストli 1とli 2は変わらない.ネストされたリストでない場合は、深さのコピーに違いはありません.ネストされたリストを導入するには:
(2)ネストリスト:
くだらないことは言わない--直接コードをつけて、时間は真理を検証する唯一の基準です!!!
次に、この4つのリストのidを見てみましょう.
元のリストの一番後ろに数字を付けると、4つのリストのidは変わりません.
考えを変えてみましょう(ネストされたリストであることに注意してください)
以上より,ネストリストでは,浅いレプリケーションが元のメモリアドレスを指し,深いレプリケーションが新しいメモリ空間アドレスを指すと結論した.ネストされたリストでなければ、深いレプリケーションは新しい空間を指します.深浅コピー注意:ネストリストとネストリストでない場合!!!
元のリストの最初のレイヤのネストに要素を追加します(コードは次のとおりです!)、解析:
メモリ空間アドレスが同じなので、liとli 2、li 3は追加されます.しかしli 4は追加しないで、メモリの空間がすべて異なったためです!!!
4.今回の授業のまとめ(急いであなたのノートを出してメモしてください!)
例えば、砂糖紙と砂糖があり、深い複製は砂糖紙と砂糖に相当し、浅い複製は砂糖紙だけである.△この言葉は心に刻んで、本文を読んでから繰り返し推測して、もし深い心得があれば--おめでとうございます: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 , ,
, 。