############################ 直接引用 #############################
<<< 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 = 1b = 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,遇到 引用 問題,會一直共享一...