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