python中的深拷贝与浅拷贝
 
 
 
浅拷贝:
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的
1.也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去而是和原
对象里的可变元素指向同一个地址所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的
2.但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
 
深拷贝:
深拷贝就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象浅拷贝,原对象的 list 元素改变的话会改变当前对象,如果当前对象中 list
元素改变了,也同样会影响原对象。
 
 
深拷贝详解:
 
克隆一份,修改拷贝后的对象中的可变元素不对原对象内容产生影响
copy 模块中的 deepcopy()方法
import copy

#深拷贝:
#步骤一:进行深拷贝
list1 = [["湖北武汉", "湖南长沙"], "广州深圳", "江西南昌", "浙江杭州"]
list2 = copy.deepcopy(list1)  # 进行深拷贝
#打印
#list1和list2两个列表的内存地址 = > 结果不一样
#步骤二:打印内存地址
print(id(list1))  # 3132367069640
print(id(list2))  # 3132368415752
#步骤三:打印类别当中子集内存地址
#打印list1和list2两个列表中的子列表的内存地址 = > 结果不一样
print(id(list1[0]))  # 3132368414728
print(id(list2[0]))  # 3132368415688
#步骤四:修改子集当中数据,与拷贝的地址的数据
#修改拷贝后的list2中的可变数据类型的数据
list2[0][0] = "武汉湖北"
#结果list2列表修改了,但是不影响list1列表数据
print(list2)  
print(list1)  
"""
输出结果
[['武汉湖北', '湖南长沙'], '广州深圳', '江西南昌', '浙江杭州']
[['湖北武汉', '湖南长沙'], '广州深圳', '江西南昌', '浙江杭州']
"""

 

 
 
浅拷贝:
#步骤一:进行浅拷贝
list1 = [["湖北武汉", "湖南长沙"], "广州深圳", "江西南昌", "浙江杭州"]
list2 = list1.copy()  # 进行浅拷贝

#步骤二:查看结果的内存地址
# 打印 list1 和 list2 两个列表的内存地址 => 结果不一样
print(id(list1))  # 2105959073864
print(id(list2))  # 2105989035464
# 打印 list1 和 list2 两个列表中的子列表的内存地址 => 结果一样
print(id(list1[0]))  # 2105989035592
print(id(list2[0]))  # 2105989035592

#步骤三:修改子集的数据
# 修改拷贝后的 list2 中的可变数据类型的数据
list2[0][0] = "武汉湖北"
# 结果 list2 列表修改了,list1 列表数据也修改了
print(list2)
print(list1)
"""
结果如下
[['武汉湖北', '湖南长沙'], '广州深圳', '江西南昌', '浙江杭州']
[['武汉湖北', '湖南长沙'], '广州深圳', '江西南昌', '浙江杭州']
"""

 

深拷贝浅拷贝总结:
浅拷贝: 只复制原对象的第一层,并不包含子对象 第一层的内存赋予了一个新的内存地址 ,子集的内存地址结果A与结果B还是样
深拷贝: 将原对象所有的属性全复制过来,在内存中开辟一块新地址用来存放复制的对象