深入理解python特性_深入理解Python特性(7)
生活随笔
收集整理的這篇文章主要介紹了
深入理解python特性_深入理解Python特性(7)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
克隆對象
Python中的賦值語句不會創建對象的副本,只是將名稱綁定到對象上。對于不可變對象也是如此。但為了處理可變對象或可變對象集合,需要一種方法來創建這些對象的“真實副本”或“克隆體”。從本質上講,你有時候需要用到對象的副本,以便修改副本時不會改動本體。先來看如何復制Python的內置容器(collection)。Python的內置可變容器,如列表、字典和集合,調用對應的工廠函數就能完成復制:但用這種方法無法復制自定義對象,且最重要的是這種方法只創建淺副本。對于像列表、字典和集合這樣的復合對象,淺復制和深復制之間有重要的區別。淺復制是指構建一個新的容器對象,然后填充原對象中子對象的引用。本質上淺復制只執行一層,復制過程不會遞歸,因此不會創建子對象的副本。深復制是遞歸復制,首先構造一個新的容器對象,然后遞歸的填充原始對象中子對象的副本。這種方式會遍歷整個對象樹,以此來創建原對象及其所有子項的完全獨立體的副本。先嘗試向原對象(xs)添加一個新列表,然后查看這個改動是否影響了副本(ys):從中可以看出,修改淺復制的列表完全不會影響副本。但由于前面只創建了原列表的淺副本,所以ys仍然含有xs子對象的引用,這些子對象沒有復制,只是在ys中再次引用。因此在修改xs中的子對象時,這些改動也會反映在ys中——因為兩個列表共享相同的子對象。這個副本是僅含有一層的淺復制:修改了xs中的子對象,ys相對應的子對象也發生變化。制作深副本使用copy模塊中的deepcopy函數創建深副本:
現在原對象和副本是完全獨立的。復制過程中遞歸復制了xs,包括它的所有子對象。
By the way, copy.copy()函數會創建對象的淺副本。
在代碼中,copy.copy()可以清楚地表明創建的是淺副本。但對于內置容器,只需要使用list、dict和set這樣的工廠函數就能創建副本,這種方式更具Python特色。
復制任意對象
copy模塊中的copy和deepcopy函數可以復制任意對象。
首先定義一個2D 點類:
由于點對象使用不可變類型(int)作為坐標,淺深復制之間并沒有區別。下面來看一個更復雜的例子, 2D矩形類:
可以看到修改原對象的子對象,淺復制的副本相應發生變化。
而深復制則不會:
關鍵要點:
創建的淺副本不會克隆子對象,因此副本和原對象并不完全獨立。
對象的深副本將遞歸克隆子對象。副本完全獨立于原對象,但創建? ? ? ? ?深副本的速度比較慢,因為發生了遞歸。
使用copy模塊可以復制任意對象(包括自定義對象)。
總結
以上是生活随笔為你收集整理的深入理解python特性_深入理解Python特性(7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 多线程 全站小说_多线程下
- 下一篇: python中指定变量为1byte_Py