深浅拷贝的区别

深浅拷贝的区别

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()得到的一个拷贝对象,被拷贝对象的的子元素发送变化后,并不影响拷贝对象的值,反之亦然。

原文地址:https://www.cnblogs.com/bs2019/p/12102493.html