python的深拷贝和浅拷贝

前言:在python 中 int 、str 、tuple(元组)是不可变对象 ;list、dict属于可变对象

from copy import copy,deepcopy   #先引入用到的方法
list1=[1,2,("abc",1,2),[6,7,8]]
list2=copy(list1)    #浅拷贝
list3=list1[:]   #这个地方是为了说明切片相当于一个浅拷贝
print("三个列表的id内存地址如下:")
print(id(list1))
print(id(list2))
print(id(list3))  #根据结果可看出三个列表的id内存地址都是不一样的
print("=============================================")
print("三个列表的可变子列表的id地址如下:")   #分别比较各列表的第四个元素,为list类型的元素(可变对象)
print(id(list1[3]))
print(id(list2[3]))
print(id(list3[3]))   #从下图输出结果可以看到,浅拷贝的可变子列表的id都是一样的
print("三个列表的不可变子列表的id地址如下:")   #分别比较各列表的第三个元素,其为tuple类型元素(不可变对象)
print(id(list1[2]))
print(id(list2[2]))
print(id(list3[2]))   #从下图输出结果可以看到,浅拷贝的可变子列表的id都是一样的

#下面定义一个深拷贝:
list6=deepcopy(list1)
print("==================================================")
print("原列表的id地址:{}".format(id(list1)))
print("深拷贝列表的id地址:{}".format(id(list6)))

print("==================================================")
print("原列表的不可变元素id地址:{}".format(id(list1[2])))
print("深拷贝列表的不可变元素id地址:{}".format(id(list6[2])))         #这里比较的还是列表的第三个元素,tuple类型(不可变对象)

print("==================================================")
print("原列表的可变元素id地址:{}".format(id(list1[3])))
print("深拷贝列表的可变元素id地址:{}".format(id(list6[3])))              #这里比较第四个元素

上面的代码运行的结果如下:

2335298709248
2335299365760
2335299364992
=============================================
三个列表的可变子列表的id地址如下:
2335298711424
2335298711424
2335298711424
三个列表的不可变子列表的id地址如下:
2335298637696
2335298637696
2335298637696
==================================================
原列表的id地址:2335298709248
深拷贝列表的id地址:2335299365504
==================================================
原列表的不可变元素id地址:2335298637696
深拷贝列表的不可变元素id地址:2335298637696
==================================================
原列表的可变元素id地址:2335298711424
深拷贝列表的可变元素id地址:2335299365824

总结:我们可以简单的理解为:其实浅拷贝只是拷贝了最外一层,其可变子列表指向的还是同一个内存地址。但是深拷贝,会把所有的层都拷贝(只针对可变对象,即不可变对象的内存地址还是一样的),这里的层可以简单的理解为一个[] 、()、{} 就算一层

 

posted @ 2020-12-19 22:45  miracle2  阅读(226)  评论(0编辑  收藏  举报