日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

深入理解python特性_深入理解Python特性(7)

發布時間:2025/3/21 python 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。