Python中的深拷貝與淺拷貝

2022-07-18 15:39:25 字數 2301 閱讀 6681

定義:所謂淺拷貝就是對引用的拷貝;

所謂深拷貝就是對物件的資源的拷貝。

1、對於直接賦值(=),有如下三點認識:

1)、賦值是將乙個物件的位址賦值給乙個變數,讓變數指向該位址(舊瓶裝舊酒)。

2)、修改不可變物件(str、tuple)需要開闢新的空間

3)、修改可變物件(list等)不需要開闢新的空間

#對於賦值運算,就是指向同乙個記憶體位址.

s1 = 'alex'

s2 = s1

print(s1, id(s1)) #alex 1996081840344

print(s2, id(s2)) #alex 1996081840344

#當s1的值修改時,記憶體位址也發生了變化

s1 = 'alex'

print(s1, id(s1)) #alex 1515050615000

s1 = 'alex2'

print(s1, id(s1)) #alex 1515051454624

#當列表l1新增乙個值,其記憶體位址不變

l1 = [1,2,3]

l2 = l1

print(l1, id(l1)) #[1, 2, 3] 1730542337864

print(l2, id(l2)) #[1, 2, 3] 1730542337864

print(l1, id(l1)) #[1, 2, 3, 4] 1730542337864

print(l2, id(l2)) #[1, 2, 3, 4] 1730542337864

2、copy淺拷貝,只拷貝父物件,沒拷貝子物件,所以原始資料改變,子物件會改變

#切片賦值相當於淺copy,只拷貝值,不拷貝記憶體位址

l1 = [1,2,3]

l2 = l1[:]

print(l1, id(l1)) #[1, 2, 3] 2685913624392

print(l2, id(l2)) #[1, 2, 3] 2685913645192

print(l1, id(l1)) #[1, 2, 3, 4] 2685913624392

print(l2, id(l2)) #[1, 2, 3] 2685913645192

#只拷貝父物件第一次的值,不拷貝記憶體位址

l1 = [1,2,3]

l2 = l1.copy()

print(l1, id(l1)) #[1, 2, 3, 666] 2170284179272

print(l2, id(l2)) #[1, 2, 3] 2170284195976

#對於淺copy來說,第一層都是獨立的記憶體位址,從第二層開始,都是指向同乙個記憶體位址,一變都變

l1 = [1,2,3,[22,33]]

l2 = l1.copy()

print(l1, id(l1)) #[1, 2, 3, [22, 33, 666]] 1643848253576

print(l2, id(l2)) #[1, 2, 3, [22, 33, 666]] 1643848253704

3、deepcopy深拷貝,包含父物件及其子物件的拷貝,所以原始物件的改變不會造成深拷貝裡任何子元素的改變

#對於深copy來說,無論多少層,在記憶體中都是兩個獨立的記憶體位址

import copy #引入copy模組

l1 = [1,[22,33]]

l2 = copy.deepcopy(l1)

print(l1, id(l1), id(l1[1])) #[1, [22, 33, 66], 77] 1756548727112 1756548726920

print(l2, id(l2), id(l2[1])) #[1, [22, 33]] 1756548728392 1756548728328

總結:

1、深淺拷貝都是對源物件的複製,占用不同的記憶體空間。

2、不可變型別(數字、字串、元組)的物件,對於深淺拷貝毫無影響,最終的位址值和值都是相等的。

3、可變型別(列表、字典):

copy淺拷貝:值相等,位址不相等

deepcopy深拷貝:值相等,位址不相等

python 中的拷貝 淺拷貝與深拷貝

0.序列指什麼?序列型別是指容器內的元素從0開始的索引順序訪問,一次可以訪問乙個或者多個元素,包括字串 string 元組 tuple 列表 list the difference between tuple and list tuple would not be changed,but list ...

python中淺拷貝與深拷貝

淺拷貝,拷貝的是父物件,不會拷貝到內部的子物件。單從乙個淺字就可以看出他拷貝的東西不深,可以理解為只拷貝一層 import copy a 1,ss 2,3 b copy.copy a print b print id a print id b 現在有乙個列表a裡面有數字,字串,列表和字典 用淺拷貝的...

Python中的淺拷貝與深拷貝

1.淺拷貝 情況1的例項如下 import copy a 1,2 b 3,4 c a,b 注意這裡的c就是乙個可變物件!d copy.copy c print 變數c c print print 變數d d 結果 變數c 1,2 3,4 變數d 1,2 3,4 原因分析 需要拷貝的物件c是乙個lis...