python3 深浅copy对比详解
一、赋值对比
1、列表
l1=[1,2,3]
l2=l1
l1.append('a')
print(l1,l2)#[1,2,3,'a'][1,2,3,'a']
print(id(l1),id(l2))#4349984843499848
#可以看到两个列表的值以及id值相同,对应的是同一个内存地址
2、字典
dic={'name':'barry'}
dic1=dic
dic['age']=18
print(dic,dic1)#{'name':'barry','age':18}{'name':'barry','age':18}
print(id(dic),id(dic1))#3115734431157344
#可以看到两个字典的值以及id值相同,对应的是同一个内存地址
3、字符串
s='alex'
s1=s
s2=s.replace('a','A')
print(s,s1,s2)#alexalexAlex
print(id(s),id(s1),id(s2))#310402083104020831040376
#赋值是同一个内存地址,替换字符串后的变量s2是另外的地址
二、深浅copy
1、浅copy
对于浅copy来说,第一层创建的是新的内存地址。而从第二层开始,指向的是同一个内存地址,所有,对于第二层以及更深的层数来说,保持一致性。
#1、普通浅copy
l1=[1,2,3,4]
l2=l1.copy()
l1.append('a')
print(l1,l2)#[1,2,3,4,'a'][1,2,3,4]
print(id(l1),id(l2))#3707732037078664
#id内存地址不一样,创建了两个地址空间,一个改变,另一个不会变化
#2、嵌套浅copy
importcopy
l1=[1,[22,33,44],3,4,]
l2=copy.deepcopy(l1)
#改变第一层
l1[0]=111
print(l1,l2)#[111,[22,33,44],3,4][1,[22,33,44],3,4]
print(id(l1),id(l2))#4323853643239048
#改变第二层
l1[1].append('a')
print(l1,l2)#[111,[22,33,44,'a'],3,4][1,[22,33,44],3,4]
print(id(l1),id(l2))#4323853643239048
2、深copy.deepcopy()
对于深copy来说,两个是完全独立的,改变任意一个的元素(无论是多少层),另一个绝不会改变。
importcopy
l1=[1,[22,33,44],3,4,]
l2=copy.deepcopy(l1)
#改变第一层
l1[0]=111
print(l1,l2)#[111,[22,33,44],3,4][1,[22,33,44],3,4]
print(id(l1),id(l2))#4323853643239048
#改变第二层
l1[1].append('a')
print(l1,l2)#[111,[22,33,44,'a'],3,4][1,[22,33,44],3,4]
print(id(l1),id(l2))#4323853643239048
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。