python中的淺拷貝和深拷貝

2021-08-04 03:53:41 字數 1406 閱讀 1813

不得不說《python核心程式設計》是一本好書,看到其中一節做一下隨筆。
在python中,當建立乙個物件後,然後把它賦給另乙個物件時,python並沒有去拷貝這個物件,而是拷貝了這個物件的引用。

看不懂沒關係,我們看乙個例子。

>>>raw_list = ['first', ['second', 12], 32]

>>>copy_list = raw_list[:]

>>>copy_list[1][1] = 20

>>>copy_list

...['first', ['second', 20], 32]

>>>raw_list

...['first', ['second', 20], 32]

>>>copy_list[2] = 50

>>>raw_list

...['first', ['second', 20], 32]

上面**可以很神奇的發現,我用切片複製的方法複製raw_list得到copy_list,然後第一次我去改變copy_list的值,然後raw_list也跟著發生改變。但是第二次我去改變copy_list,raw_list卻沒有發生變化。  

這是因為,當進行淺拷貝的時候,字串(firs)和數字(32)是不可被改變的並且被真實的複製了,並建立了新的物件,而列表(['second', 12])是可變的,只是把它的引用進行了複製,我們去改變列表的時候,他的引用都會發生變化。  

進行淺拷貝有如下幾種方式:1.完全切片操作[:],2.利用工廠函式,3.使用copy模組的copy函式。

對於深拷貝來說,這相當與完完全全建立了乙個新的物件,新的容器,我們看下面的例子
>>>import copy

>>>raw_list = ['first', ['second', 12], 32]

>>>copy_list = copy.deepcopy(raw_list)

>>>copy_list[1][1] = 20

>>>copy_list

...['first', ['second', 20], 32]

>>>raw_list

...['first', ['second', 12], 32]

可以看到,我們用copy.deepcopy()函式拷貝得到了copy_list,當我們改變copy_list的時候,raw_list並不會發生改變,因為深拷貝建立了乙個新的物件。
1.當運算元據,並且不想改變原資料的時候,使用深拷貝可能是個很好的選擇。 

2.非容器型別(如數字,字串等)沒有被拷貝這一說法。 

3.只有原子型別的元組只有淺拷貝,沒有深拷貝。

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...

Python中的深拷貝和淺拷貝

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