Python複製引用 淺拷貝 深拷貝

2022-08-11 09:18:12 字數 1564 閱讀 9433

#

########################### 直接引用 #############################

<<< a = [1,2,3,4]

<<< b =a

#假設id(a)指向a,則id(b)也指向a,且值都為[1,2,3,4]

a = [4,5,6,7]

#a重新賦值,id指向b,

#此時b依舊指向a和[1,2,3,4]

#而a指向新位址b和[4,5,6,7]

​a = [1,2,3,4]

b =a

a[0]=4a[1]=5a[2]=6a[3]=7

#通過索引更改a的值

#此時a和b依舊指向原來的記憶體位址,但是值都更新為了[4,5,6,7]​#

######################### 淺複製 ###############################

a = [1,2,3,4]

b=a.copy()

#假設id(a)指向a,則id(b)指向b

a[0]=0

#id(a)依舊指向a,但是值改變了

#id(b)位址和值都沒變 不含子物件,a和b獨立,此時為深複製​#

但是當a中包含子物件時,子物件在淺複製時就會採用 引 用 方式而不是完全複製。繼續使用淺複製時就會造成內層子物件的不完全複製,改變乙個變數,另乙個也會隨之改變

import

copy

a=[1,2,3,4,[4,5,6,7]]

b=copy.copy(a)

#假設id(a)指向a,則id(b)指向b,值都為[1,2,3,4,[4,5,6,7]]​#

id(a)依舊指向a,值變為[1,2,3,4,[4,5,6,7,100]]

#id(b)依舊指向b, 值也變為[1,2,3,4,[4,5,6,7,100]]​#

##################### 深複製(deepcopy)符合我們直觀的「複製」,完全獨立,互不影響。

直接賦值既不是淺拷貝也不是深拷貝,我和你本質是一樣的,只是名字不一樣而已。

a = 1

b = a

>>> a

1>>> b

1b = 2 #復新值,你就走了,a仍舊保持初心。

>>> b2a

>>>1

​a = [1, 2, [3, 4]]

b = a

b[2][0] = 99

b[1] = 88

print(a) #a與b同,你變我也變

print(b)

[1, 88, [99, 4]]

[1, 88, [99, 4]]

淺拷貝(包括copy,切片):拷貝父物件,不會拷貝物件的內部的子物件。只複製物件本身,沒有複製該物件所引用的物件。a 和 b 是乙個獨立的物件,但他們的子物件還是指向統一物件,是引用。

深複製(deepcopy),不僅複製物件本身,同時也複製該物件所引用的物件。a 和 b 完全拷貝了父物件及其子物件,兩者是完全獨立的。是我們直觀上真正意義的「複製」。

轉 Python深複製淺複製or深拷貝淺拷貝

copy.copy 淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件。copy.deepcopy 深拷貝 拷貝物件及其子物件 用乙個簡單的例子說明如下 import copy a 1,2,3,4,a b c b a c copy.copy a d copy.deepcopy a 很容易理解 a是乙個...

Python深複製淺複製or深拷貝淺拷貝

簡單點說 1.copy.copy 淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件。2.copy.deepcopy 深拷貝 拷貝物件及其子物件 用乙個簡單的例子說明如下 import copy a 1,2,3,4,a b c b a c copy.copy a d copy.deepcopy a 很...

python 引用,淺拷貝,深拷貝

引用 當物件是不可變型別的時候,int float double string tuple 純tuple 遇到 引用 問題時,雖然起初兩個變數指向同乙個記憶體位址,但是改變了其中乙個值,並不會影響另外乙個 會重新開闢記憶體位址 當物件是可變型別的時候,list dic,遇到 引用 問題,會一直共享一...