list的浅拷贝和深拷贝
参考:https://blog.csdn.net/sxingming/article/details/51912281
浅拷贝
<1> a=b
a=b这个做法只是将b的地址赋值给了a,a和b同时指向一个链表,所以a和b的值永远是一样的
b = [1,2,3,4]
a = b #浅拷贝
print('a:',a) #a=[1, 2, 3, 4]
print('b:',b) #b=[1, 2, 3, 4]
b.append(21)
print('a:',a) #a=[1, 2, 3, 4, 21]
print('b:',b) #b= [1, 2, 3, 4, 21]
if(id(a)==id(b)):
print('same id')
<2>a=b[:] 和copy.copy() 一样都是浅拷贝
为a开辟了新的空间,a和b的id不同了,但每个位置上的id是一样的
import copy
b = [1,2,[3,4]]
a = b[:] #浅拷贝
c = copy.copy(b) #和[:]效果一样
b.append(5)
print('b:',b) #b=[1, 2, [3, 4],5]
print('a:',a) #a=[1, 2, [3, 4]] #b变a不变
print('c:',c) #a=[1, 2, [3, 4]] #b变c不变
b[2].append(5)
print('b:',b) #b= [1, 2, [3,4,5],5]
print('a:',a) #a=[1, 2, [3,4,5]] #b变a也变
print('a:',c) #a=[1, 2, [3,4,5]] #b变a也变
print('id a:',id(a))
print('id b:',id(b)) #a和b的id 不一样
print('id c:',id(c))
print('id a[1]:',id(a[1]))
print('id b[1]:',id(b[1])) #a和b每个位置上的id是一样的
print('id c[1]:',id(c[1])) #a和b每个位置上的id是一样的
可以通过下图理解
深拷贝copy.deepcopy()
import copy
b = [1,2,[3,4]]
a = b[:] #浅拷贝
c = copy.deepcopy(b) #深拷贝
b.append(5)
print('b:',b) #b=[1, 2, [3, 4],5]
print('a:',a) #a=[1, 2, [3, 4]] #b变a不变
print('c:',c) #a=[1, 2, [3, 4]] #b变c不变
b[2].append(5)
print('b:',b) #b= [1, 2, [3,4,5],5]
print('a:',a) #a=[1, 2, [3,4,5]] #b变a也变
print('c:',c) #a=[1, 2, [3,4,5]] #b变c不变
print('id a:',id(a))
print('id b:',id(b)) #a和b的id 不一样
print('id c:',id(c))
#深拷贝是列表的位置会开辟新位置
print('id a[1]:',id(a[2])) #4439847208
print('id b[1]:',id(b[2])) #4439847208
print('id c[1]:',id(c[2])) #4439849656