深拷贝和浅拷贝

‘’’
1、拷贝:是指使用一个已存在的对象,生成一个新的对象,两个对象在内存中具有独立的存储空间
2、浅拷贝:1)是指创建一个新的对象时,只拷贝内容,是原始对象的引用,而不是创建原始对象的副本数据
2)不具有数据独立性
3)对象的copy()方法、copy模块的copy()方法、工厂方法、切片等方法得到的都是浅拷贝对象
4)程序的大部分场景都是用浅拷贝
3、深拷贝:1)是指创建一个新的对象,并递归地复制原始对象及其所有嵌套对象地内容,而不仅仅是复制它们的引用
2)具有数据独立性
3)使用copy模块的deepcopy()方法得到深拷贝数据
4)类似公共排序方法sorted()实现就可以用深拷贝,因为该方法返回排序后的一个新列表,该列表可能在程序其他位置被修改,
避免影响原数据,深拷贝更合适
4、深浅拷贝是针对于复杂的容器数据
‘’’
import copy
def copy_categopy():
originData = [‘hello’,[1,2],{‘name’:‘Tom’,‘chars’:[‘A’,‘B’]}]
#浅拷贝:对象的copy()方法
copyDate1 = originData.copy()
print(copyDate1)
#浅拷贝:工厂方法
copyDate2 = list(originData)
print(copyDate2)
#浅拷贝:切片
copyDate3 = originData[::]
print(copyDate3)
#浅拷贝:copy模块的copy()方法
copyDate4 = copy.copy(originData)
print(copyDate3)
print(copyDate1 == copyDate2 == copyDate3 == copyDate4)
#浅拷贝对象ID不同
print(id(copyDate1))#具有独立的存储空间
print(id(copyDate2))#具有独立的存储空间
print(id(copyDate3))#具有独立的存储空间
print(id(copyDate4))#具有独立的存储空间
#当修改任意对象时,其他对象都会受影响
copyDate4[0] = ‘Hi’
copyDate3[2][‘chars’][1] = ‘BBB’
print(copyDate1)
print(copyDate2)
print(copyDate3)
print(copyDate4)
#深拷贝
copyDate5 = copy.deepcopy(originData)
print(copyDate5)
copyDate5[2][‘chars’][1] = ‘ccc’
print(copyDate5)
stu = [{‘name’:‘Tom’,‘age’:22},
{‘name’:‘Jack’, ‘age’: 26},
{‘name’:‘Rose’, ‘age’: 42},
{‘name’:‘Tony’, ‘age’: 8},
{‘name’:‘Alice’, ‘age’: 59},
]
stu.sort(key=lambda x:x[‘name’]) #sort直接在列表基础上排序的
print(stu)
stu = [{‘name’:‘Tom’,‘age’:22},
{‘name’:‘Jack’, ‘age’: 26},
{‘name’:‘Rose’, ‘age’: 42},
{‘name’:‘Tony’, ‘age’: 8},
{‘name’:‘Alice’, ‘age’: 59},
]
#深拷贝应用场景
def MySorted(obj,key=None):
obj_copy = copy.deepcopy(obj)
obj_copy.sort(key = key)
return obj_copy

if name == ‘main’:
copy_categopy()
res = MySorted(stu, key=lambda x: x[‘name’]) # sorted 不对原始列表做改变进行排序,相当于深拷贝
print(stu)
print(res)