要理解深拷貝和淺拷貝,首先要理解可變物件和不可變物件。
不可變物件:該物件所指向的記憶體中的值不能被改變,修改物件的值時,由於其指向的值不能被改變,因此實際上是在記憶體中重新開闢乙個位址用來儲存新的值,然後將物件指向這個新值。本質上是兩個物件,賦值前後物件id發生了變化。python中的不可變物件包括:bool、int、str、float、tuple、frozenset、none。
python中的賦值語句不會建立物件的拷貝,僅僅只是將變數名稱繫結到乙個物件上。對於不可變物件,這種操作不會產生差別,但是處理可變物件或可變物件的集合時,你可能希望建立這些物件的「真實拷貝」,在修改建立的拷貝時不改變原始的物件。
淺拷貝:通常指構造乙個新的集合物件,然後用原始物件中的找到的子物件的引用來填充它。淺層的複製只有一層深度,複製過程中不會遞迴,所以不會建立子物件本身的副本。
深拷貝:深拷貝使複製過程遞迴,即首先構造乙個新的集合物件,然後遞迴地用在原始物件中找到的子物件的副本來填充它。通過深拷貝複製物件,是原始物件及其所有子物件的完全獨立的轉殖。
python的賦值語句不會複製物件,而是建立乙個物件的引用(可以理解為標籤)。**示例:
上圖示例中,建立了兩個變數(實際兩個變數表示的是同乙個列表),但兩個變數id相同,指向的是同乙個記憶體位址。
仍以python列表為例,通常我們會用list()函式來複製乙個列表,這個複製過程,就是乙個淺拷貝。**示例:
可以看到,通過淺拷貝方式,確實是複製了乙個列表。複製前後兩個變數的id不同,兩個變數指向兩個不同的記憶體位址,且修改其中乙個列表中的值,對另乙個列表不會產生影響。
而之所以稱這種複製方式為淺拷貝,是因為這種拷貝只對一層物件有效,當列表中有子物件時,對子物件的修改將同時影響原始物件和拷貝物件。**示例:
如上圖所示,修改第一層次的成員值,不會影響拷貝物件;修改子物件的成員值(第二層次),會同時影響原始物件和拷貝物件。這是因為淺拷貝沒有遞迴複製原始物件的值,只複製了第一層,因此拷貝物件中複製了子物件的引用,並沒有複製子物件的值。
python標準庫中的copy模組提供了建立python物件的淺拷貝和深拷貝的介面。使用deepcopy()函式,可以建立乙個物件的深拷貝。**示例:
如上圖所示,通過深拷貝複製的物件遞迴轉殖了原始物件,兩者是完全獨立的。無論怎樣修改其中乙個物件,都不會對另乙個物件產生影響。
Python 淺拷貝與深拷貝
淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...
Python 淺拷貝與深拷貝
以下例項是使用 copy 模組的 copy.copy 淺拷貝 和 copy.deepcopy usr bin python coding utf 8 import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物件的引用 c copy.copy a 物件拷貝,淺拷貝 d copy....
python 深拷貝與淺拷貝
當乙個變數 的時候,約定為 指向位址的過程 如果copy.copy 拷貝的是元組,那麼它不會進行淺拷貝,僅僅是指向 因為元組是不可變資料型別,那麼意味著資料一定不能修改,因此用copy.copy的 時候它會自動判斷,是指向。如果,用copy.copy copy.deepcopy 對乙個全部是不可變型...