深浅拷贝的区别
深浅拷贝的区别
1.赋值运算
l1 = [1,2,3,['tank','nick']]
l2 = l1
l1[0] = 111
print(l1) # [111, 2, 3, ['tank', 'nick']]
print(l2) # [111, 2, 3, ['tank', 'nick']]
l1[3][0] = 'kevin'
print(l1) # [111, 2, 3, ['kevin', 'nick']]
print(l2) # [111, 2, 3, ['kevin', 'nick']]
对于赋值运算的 l1 和l2 指向同一个内存地址 ,所以是完全一样的。数据共用。
深浅拷贝针对的是可变类型的数据,对于不可变类型的数据,无论深浅拷贝,数据都是共用的,只要一个拷贝的值发生改变,另外一个不会受影响,没有任何的意义。
2.浅拷贝
l1 = [1,'tank',(1,2,3),[22,23]]
l2 = l1.copy()
l1[-1][1] = 10
print(l1) #[1, 'tank', (1, 2, 3), [22, 10]]
print(l2) #[1, 'tank', (1, 2, 3), [22, 10]]
print(id(l1[1])) #2405832388824
print(id(l2[1])) #2405832388824
print(id(l1)) #2526331895048
print(id(l2)) #2526331994696
print(id(l1[3])) #2526331894856
print(id(l2[3])) #2526331894856
print(id(l1[0])) #1505198192
print(id(l2[0])) #1505198192
对于浅拷贝,只是内存空间重新开辟了一块名称空间,但是被拷贝对象中的数据(无论可变还是不可变类型数据)都是共用的。对于拷贝对象的子元素是可变类型的,通过copy()或赋值得到的一个拷贝对象,被拷贝对象的子元素的值发送变化后,拷贝对象的值亦随之发生变化,反之亦然。
3.深拷贝
import copy
l1 = [1,'tank',(1,2,3),[22,23]]
l2 = copy.deepcopy(l1)
l1[-1][1] = 10
print(id(l1[1]))#2544575770840
print(id(l2[1]))#2544575770840
print(l1)#[1, 'tank', (1, 2, 3), [22, 10]]
print(l2)#[1, 'tank', (1, 2, 3), [22, 23]]
print(id(l1))#2544576199944
print(id(l2))#2544576299592
print(id(l1[3]))#2544576199752
print(id(l2[3]))#2544576299528
print(id(l1[0]))#1505198192
print(id(l2[0])) # 1505198192
对于深拷贝,内存空间中重新开辟一块新的名称空间,但是对于被拷贝对象中的可变类型的数据是重新创建的。通过deepcopy()得到的一个拷贝对象,被拷贝对象的的子元素发送变化后,并不影响拷贝对象的值,反之亦然。