python中的賦值 淺拷貝 深拷貝

2021-09-19 03:19:07 字數 1083 閱讀 7849

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用

import copy

a=[1,2,['x','y']]

b=ac=copy.copy(a)

d=copy.deepcopy(a)

print('id(b)==id(a) ',id(b) == id(a)) #true

print('id(c)==id(a) ',id(c) == id(a)) #false

print('id(d)==id(a) ',id(d) == id(a)) #false

print('a[2]=%s b[2]=%s' %(a[2],b[2])) #b改變a改變,a、b指引同一物件

print('id(b[2])==id(a[2]) ',id(b[2])==id(a[2]))

a[2]=['x', 'y', 'b+'] b[2]=['x', 'y', 'b+']

id(b[2])==id(a[2]) true

print('a[2]=%s c[2]=%s' %(a[2],c[2])) #a、c雖然不是指引同一物件,但是a[2]、c[2]指引同一物件

print('id(c[2])==id(a[2]) ',id(c[2])==id(a[2]))

a[2]=['x', 'y', 'b+', 'c+'] c[2]=['x', 'y', 'b+', 'c+']

id(c[2])==id(a[2]) true

print('a[2]=%s b[2]=%s' %(a[2],d[2])) #a、d不是指引同一物件,a[2]、d[2]也不是指引同一物件

print('id(d[2])==id(a[2]) ',id(d[2])==id(a[2]))

a[2]=['x', 'y', 'b+', 'c+'] b[2]=['x', 'y', 'd+']

id(d[2])==id(a[2]) false

參考:

js 淺拷貝直接賦值 js的賦值與淺拷貝 深拷貝

昨天翻了下陣列api,看到concat和slice方法,突然想到這個兩個方法是淺拷貝還是深拷貝,結果陷入了死胡同,為什麼mdn文件說是淺拷貝,但進行簡單的操作為什麼能複製成功啊,糾結半天後才弄清原由,原來我一直把賦值和深淺拷貝搞混了。首先不要把引用型別的賦值歸結為淺拷貝,深拷貝和淺拷貝只針對像 ob...

Python 賦值 淺拷貝 深拷貝

賦值 a b,只拷貝了物件的引用,沒有拷貝內容。兩個物件的id一樣 淺拷貝 copy.copy 構造乙個新的復合物件,然後將子物件引用插入到原始物件的副本中。深拷貝 copy.deepcopy 構造乙個新的復合物件,然後遞迴地將子物件副本插入原始物件的副本。給個栗子 從這個栗子可以看出,對c進行修改...

python賦值 淺拷貝 深拷貝

視覺化 首先了解知識點 可變 list,dict 和不可變 string,int,tuple 淺拷貝 對於string int來說沒有意義,因為它們資料就一層,對於tuple由於是不可變型別所以新的物件會指向原來的物件位址,對於list和dict,新的物件會在記憶體中開闢乙個新的記憶體空間,並且只拷...