Loading

深浅拷贝

1 不同数据类型在内存中的存址方式

str和int类型:一旦被创建,(在内存中的地址)则不能被修改,如果要修改,需要再创建内存

对于字典,元组,列表:类似于链表的形式,可以记录上一个的内存位置,也可以记录下一个的内存位置,是动态的.

所以:

1.对于int和str来说,深浅拷贝(和赋值)没有意义,因为其永远指向一个内存地址.
2.对于字典,元组,列表来说则有区别
# 如下代码
n1 = {'k1':"kk",'k2':123,'k3':["abc",678]}
#如果对n2赋值
n2 = n1

对于这个字典而言,n1和n2指向的是同一个内存地址,它们的id是相同的。

image

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的值是相同的,即浅拷贝只拷贝外部,内层并不会真正拷贝

image

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

字符串和数字的拷贝没有意义,所以深拷贝在拷贝时遇到字符串和数字即意味着拷贝结束。

而深拷贝情况下列表,字典,元组则会继续拷贝,无论嵌套有几层都会拷贝直到最底层,最底层不拷贝.
image

posted @ 2021-10-12 12:45  yyyz  阅读(26)  评论(0编辑  收藏  举报