python高階 深拷貝 淺拷貝

2022-09-05 14:54:13 字數 2437 閱讀 2007

複製需要區分,,複製的是原始檔的資料,還是指向原始檔資料的位址

1.引用   b=a時,理解為b指向了a指向的資料,相當於引用複製

a=[1,2]

b=a#驗證複製的是資料還是位址

#1.檢視ab的位址

id(a) #2677646858824

2. 淺拷貝--copy.copy()

import copy

a=[1,2]

b=[3,4]

c=[a,b]

d=copy.copy(c)

#驗證方法1

id(d) #2677647114120

id(c) #2677644514824

#驗證方法2

c #[[1, 2], [3, 4], 6]

d #[[1, 2], [3, 4]]

#驗證方法1

id(d[0]) #2677647113672

id(c[0]) #2677647113672

#驗證方法2

c #[[1, 2, 5], [3, 4]]

d #[[1, 2, 5], [3, 4]]

淺拷貝僅僅把最外面1層進行了copy,並沒有把裡面多層巢狀進行遞迴拷貝,裡面的還是指向原來的位址

3.深拷貝 copy.deepcopy()

import copy

a=[1,2]

b=[3,4]

c=[a,b]

d=copy.deepcopy(c)

#驗證方法1

id(d) #2677647114120

id(c) #2677644514824

#驗證方法2

c #[[1, 2], [3, 4], 6]

d #[[1, 2], [3, 4]]

#驗證方法1

id(c[0]) #2677647113672

id(d[0]) #2677645539912

#驗證方法2

c #[[1, 2, 5], [3, 4]]

d #[[1, 2], [3, 4]]

深拷貝遞迴拷貝, 多層時,每層都拷貝物件的值

4.深拷貝和淺拷貝的應用  

a=[1,2]

def aa(num):

a #[1, 2]

aa(a)

a #[1, 2, 3]

#如果想不改變源資料需要複製,最好用深複製

aa(copy.deepcopy(a))

a #[1, 2]

5.注意事項

a=(1,2)

b=[1,2]

a1=copy.copy(a)

b1=copy.copy(b)

id(a)

#2677645526152

id(a1) #

2677645526152

id(b) #

2677645754888

id(b1) #

2677647113800

#結論:元組即使是1層,copy不拷貝,相當實用"="

#驗證:元組中巢狀列表是都拷貝

a=[1,2]

b=(3,4,a)

b1=copy.copy(b)

id(b)

#2677645507248

id(b1) #

2677645507248

#結論是不拷貝

列表是可變的,,所以可以copy,元祖是不可變的,copy後改變不了,所以copy前後的2個set均不能被修改,但占用了2個空間,,沒有意義但是浪費空間,所以不能copy

a=(1,2)

a1=copy.deepcopy(a)

id(a) #2677645531976

id(a1) #2677645531976

a=[1,2]

b=(3,4,a)

b1=copy.deepcopy(b)

id(b) #2677645547848

id(b1) #2677645507896

結論:如果copy的是物件多層巢狀中的物件都不可變,則深拷貝和淺拷貝都失效,僅僅指向引用,如果最外層不可變,內層巢狀中包含可變物件,淺拷貝不拷貝,指向引用,深拷貝進行copy 

總結論:

淺拷貝如果最外層是list可變的,淺拷貝只拷貝最外層,內部的指向引用,如果最外層是set不可變的,不論裡面巢狀的可不可變,淺拷貝都不進行copy,只是指向引用

深拷貝如果最外層是list可變的,深拷貝遞迴拷貝,如果最外層是set不可變的,裡面巢狀的包含可變的,深拷貝進行copy,如果裡面巢狀的也無可變的,深copy也不copy

其他如果使用列表的切片,相當於copy.copy() 淺拷貝

如果使用字典中的copy()方法,相當於copy.copy() 淺拷貝

python高階之深拷貝和淺拷貝

a 18b 18id a 結果為4321867632 id b 結果為4321867632c 1 2,3 d 1 2,3 e c id c 結果為4372284616 id d 結果為4371531592 id e 結果為4372284616 這就是python裡面關於變數和引用的關係,如果我們通過...

python 淺拷貝 深拷貝

直接賦值 其實就是物件的引用 別名 淺拷貝 copy 拷貝父物件,不會拷貝物件的內部的子物件。深拷貝 deepcopy copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。usr bin python import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物...

python深拷貝 淺拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 alist 1,2,3,...