Python中的深拷貝和淺拷貝

2021-09-27 02:50:44 字數 1529 閱讀 1376

一、賦值

1、在python中,物件的賦值就是簡單的引用,a = [1,2,3], b=a,在上述情況下,a和b是一樣的,他們指向同一片記憶體,b不過是a的別名,是引用,我們可以使用b is a去判斷,返回true,表名他們位址相同內容也相同,也可以使用id()函式來檢視.看兩個列表位址是否相同。

2、賦值操作(包括物件作為引數、返回值),不會開闢新的記憶體空間,他只是賦值了物件的引用.也就是除了b這個名字之外,沒有其他的記憶體開銷,修改了a也就影響了b,修改了b,也就影響了a。

二、淺拷貝(shallowcopy)

淺拷貝會建立新的物件,其內容非原物件本身的引用,而是原物件內第一層物件的引用。

淺拷貝有三種形式:

切片操作:b = a[:]或者b = [x for x in a]

工廠函式:b = list(a);

copy函式:b = copy.copy(a)

淺拷貝產生的列表b不再是列表a了,使用is判斷可以發現他們不是同乙個物件,使用id檢視,他們也不指向同一片記憶體空間,但是當我們使用id(x)for x in a 和id(x) for x in b 來檢視a和b中元素位址時,可以看到二者包含的元素的位址時相同的。

在這種情況下列表a 和列表b是不同的物件,修改b理論上不會影響到列表a。

三、深拷貝(deepcopy)

深拷貝只是一種形式,copy模組中的deepcoopy()函式,深拷貝拷貝了物件的所有元素,包括多層巢狀的元素,因此他的時間和空間開銷要高。

同樣的對列表a,如果使用b= copy.deepcopy(a),再修改列表b也不會影響到列表a,即使巢狀的列表具有更深的層次,也不會產生任何影響,因為深拷貝拷貝出來的物件根本就是乙個全新的物件,不再與原來的物件有任何的聯絡。

四、拷貝的注意點

對於非容器型別,如數字,字元,以及其他的』』原子』』型別,沒有拷貝一說,產生的都是原物件的引用。

python中的淺拷貝和深拷貝

不得不說 python核心程式設計 是一本好書,看到其中一節做一下隨筆。在python中,當建立乙個物件後,然後把它賦給另乙個物件時,python並沒有去拷貝這個物件,而是拷貝了這個物件的引用。看不懂沒關係,我們看乙個例子。raw list first second 12 32 copy list ...

python中的深拷貝和淺拷貝

淺拷貝 copy 不拷貝物件的內容,僅僅拷貝子物件的引用 深拷貝 deepcopy 會連同拷貝子物件的記憶體,對子物件的修改不會影響源物件 下面用 來測試 import copy deftest copy 淺拷貝測試 a 10 20,5,6 b copy.copy a print a a,end t...

python中的淺拷貝和深拷貝

本篇介紹下python中的深拷貝和淺拷貝,主要從基本型別 類 不可變型別等方面進行介紹。1.介紹拷貝之前首先應該明白is和 的區別,即is表示同乙個物件,比較的是值 a 1000 b 1000 a b true a is bfalse class person object def init sel...