深浅拷贝
1 不同数据类型在内存中的存址方式
str和int类型:一旦被创建,(在内存中的地址)则不能被修改,如果要修改,需要再创建内存
对于字典,元组,列表:类似于链表的形式,可以记录上一个的内存位置,也可以记录下一个的内存位置,是动态的.
所以:
1.对于int和str来说,深浅拷贝(和赋值)没有意义,因为其永远指向一个内存地址.
2.对于字典,元组,列表来说则有区别
# 如下代码
n1 = {'k1':"kk",'k2':123,'k3':["abc",678]}
#如果对n2赋值
n2 = n1
对于这个字典而言,n1和n2指向的是同一个内存地址,它们的id是相同的。
2 浅拷贝
import copy
#导入拷贝模块
n1 = {'k1':"kk",'k2':123,'k3':["abc",678]}
n2 = copy.copy(n1)
#copy.copy浅拷贝
print(id(n1))
print(id(n2))
print(id(n2['k1']))
print(id(n1['k1']))
输出
>>>4557632
>>>4557704
>>>32034864
>>>32034864
# 可见,n1的内存与n2的内存是不同的,但是k1的值是相同的,即浅拷贝只拷贝外部,内层并不会真正拷贝
3 深拷贝
import copy
n1 = {'k1':"wu",'k2':123,'k3':["alex",678]}
n2 = copy.deepcopy(n1)
#deepcopy深拷贝
print(id(n1))
print(id(n2))
print(id(n2['k1']))
print(id(n1['k1']))
print(id(n2['k3']))
print(id(n1['k3']))
输出:
>>>31230784
>>>41986088
>>>41996336
>>>41996336
>>>43485128
>>>43484936
字符串和数字的拷贝没有意义,所以深拷贝在拷贝时遇到字符串和数字即意味着拷贝结束。
而深拷贝情况下列表,字典,元组则会继续拷贝,无论嵌套有几层都会拷贝直到最底层,最底层不拷贝.
本文来自博客园,作者:yyyz,转载请注明原文链接:https://www.cnblogs.com/yyyzyyyz/p/15397349.html