浅拷贝和深拷贝的区别是:浅拷贝只是将原对象在内存中引用地址拷贝过来了。让新的对象指向这个地址。而深拷贝是将这个对象的所有内容遍历拷贝过来了,相当于跟原来没关系了,所以如果你这时候修改原来对象的值跟他没关系了,不会随之更改。
b=a将两者指向同一个对象,而b=a[:]会创建一个新的与a完全相同的对象,但是与a并不指向同一对象。
在计算机中,不同的对象即不同的内存地址。可理解为:b=a将创建a与b两个快捷方式并指向同一文件;而b=a[:]先将a指向的文件复制一份作为副本,然后创建一个指向该副本的快捷方式b。
二者不同表现为当两者指向同一对象时,改变其中任意一个,都会改变对象的值,也就是同时改变a,b的值。
1 b=a的情形
>>>a=[1,2,3]
>>>b=a
>>>print(a,b)
[1,2,3][1,2,3]
>>>id(a)
2479355814472(不一定为此值,但一定与b的id相同)
>>>id(b)
2479355814472(不一定为此值,但一定与a的id相同)
>>>b.append(4)
>>>print(a,b)
[1,2,3,4][1,2,3,4]
2 b=a[:]的情形
>>>a=[1,2,3,4]
>>>b=a[:]
>>>id(b)
2479387665736(不一定为此值,但一定与a的id不同)
>>>print(a,b)
[1,2,3,4][1,2,3,4]
>>>b.append(5)
>>>print(a,b)
[1,2,3,4][1,2,3,4,5]
3.1 b=a.copy()的情形——数据是列表、数组和矩阵时和[:]一样,两者指向不同的内存地址,并且不相关联
3.2 b=a.copy()的情形——字典数据类型的copy函数,当简单的值替换的时候,原始字典和复制过来的字典之间互不影响,但是当添加,删除等修改操作的时候,两者之间会相互影响。
3.2.1 值替换
d = {'name' : ['An','Assan']}
c = d.copy()
d['name'] = ['an']
print(c)
print(d)
print(id(c))
print(id(d))
out:
{'name': ['An', 'Assan']}
{'name': ['an']}
1739834815760
1739805001408
3.2.2 值修改
d = { 'name' : ['An','Assan'] }
c = d.copy()
d['name'].append('shu')
print(c)
print(d)
out:
{'name': ['An', 'Assan', 'shu']}
{'name': ['An', 'Assan', 'shu']}
4 浅拷贝:copy包中的copy函数
copy.copy()对于可变类型,会进行浅拷贝
copy.copy对于不可变类型,不会拷贝,仅仅是指向
1.使用copy()拷贝不可变对象
val1 = 1000
val2 = copy.copy(val1)
print(val1,val2)#1000 1000
print(id(val1),id(val2))#2217908546992 2217908546992
val1+=1
print(val1,val2)#1001 1000
print(id(val1),id(val2))#2217893516560 2217908546992
val2+=2
print(val1,val2)#1001 1002
print(id(val1),id(val2))#2217893516560 2217945003632
#copy.copy()是指向的这个地址,原值改变后,原地址改变,所指向地址不变
2.使用copy()拷贝可变对象
ls1 =[1,2,3,4]
ls2 = copy.copy(ls1)
print(ls1,ls2)#[1, 2, 3, 4] [1, 2, 3, 4]
print(id(ls1),id(ls2))#3097360226888 3097360227016
ls1.append(5)
print(ls1,ls2)#[1, 2, 3, 4,5] [1, 2, 3, 4]
print(id(ls1),id(ls2))#3097360226888 3097360227016
3.拷贝可变对象。
cop0 = [1, 2, [3, 4]]
cop1 = copy.copy(cop0)
print(id(cop0),id(cop1))#1681929230984 1681929231112
cop0[2][0] = "hey!"
print(cop0,cop1)#[1, 2, ['hey!', 4]] [1, 2, ['hey!', 4]]
print(id(cop0),id(cop1))#1681929230984 1681929231112
5 深拷贝:copy包中的deepcopy函数
#1.使用copy.deepcopy()拷贝不可变对象的值,以及复制以后修改其值后的变化。
val1 = 1000
val2 = copy.deepcopy(val1)
print(val1,val2)#1000,1000
print(id(val1),id(val2)) #33717408 33717408 对于不可变对象,深度拷贝内存地址没有修改。
val1 += 1
print(val1,id(val1),val2,id(val2)) #1001 33717904 1000 33717408
#1.使用copy.deepcopy()复制可变对象的值,以及复制以后修改其值后的变化。
ls1 =[1,2,3,4]
ls2 = copy.deepcopy(ls1)
print(id(ls1),id(ls2)) #34628472 34628712 注意对于可变对象深度拷贝后内存地址都修改了。
print(ls1,ls2) #[1, 2, 3, 4] [1, 2, 3, 4]
ls1.append(5)
print(id(ls1),id(ls2)) #34628472 34628712
print(ls1,ls2) #[1, 2, 3, 4, 5] [1, 2, 3, 4] #注意这个时候ls2的值没有随着ls1修改。