Python 的淺拷貝與深拷貝

2021-08-21 02:34:29 字數 1924 閱讀 4064

謝謝原博對我學習的幫助:

python中關於物件複製有三種型別的使用方式,賦值、淺拷貝與深拷貝。他們既有區別又有聯絡,剛好最近碰到這一類的問題,研究下。

一、賦值

在python中,物件的賦值就是簡單的物件引用,這點和c++不同。如下:        

a = [

1,2,

3,"hello",[

"python",

"c++"]]

b = a

print a==b

#true

賦值操作(包括物件作為引數、返回值)不會開闢新的記憶體空間,它只是複製了新物件的引用。也就是說,除了b這個名字以外,沒有其它的記憶體開銷。

修改了a,就影響了b;同理,修改了b就影響了a。

a = [

1,2,

3,"hello",[

"python",

"c++"]]

b = a

"add")

print

"a=",a,

"b=",b

#a=[1, 2, 3, 'hello', ['python', 'c++'], 'add'] b=[1, 2, 3, 'hello', ['python', 'c++'], 'add']
二、淺拷貝(shallow copy)

淺拷貝會建立新物件,其內容是原物件的引用。

淺拷貝有三種形式:切片操作,工廠函式,copy模組中的copy函式。比如對上述a:        

1、切片操作:b = a[:]   或者 b

= [each for each in a

]2、工廠函式:b = list(a)

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

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

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

a = [1,2,3,"hello",["python","c++"]]

b = a[:]

print a

print b

[1, 2, 3, 'hello', ['python', 'c++']]

[1, 2, 3, 'hello', ['python', 'c++'], 'c']

但是要注意,淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在a中有乙個巢狀的list,如果我們修改了它,情況就不一樣了。

a = [1,2,3,"hello",["python","c++"]]

b = a[:]

print a

print b

[1, 2, 3, 'hello', ['python', 'c++', 'c']]

[1, 2, 3, 'hello', ['python', 'c++', 'c']]

三、深拷貝(deep copy)

深拷貝只有一種形式,copy模組中的deepcopy函式。

和淺拷貝對應,深拷貝拷貝了物件的所有元素,包括多層巢狀的元素。因而,它的時間和空間開銷要高。

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

四、關於拷貝操作的警告

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

2、如果元組變數值包含原子型別物件,即使採用了深拷貝,也只能得到淺拷貝。

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 對乙個全部是不可變型...