要想了解深浅拷贝,首先要知道什么是深浅拷贝?
深拷贝是对于一个对象所有层次的拷贝(递归)copy.deepcopy
浅拷贝是对于一个对象的顶层拷贝;通俗的理解是:拷贝了引用,并没有拷贝内容.copy.copy
深浅拷贝都是对源对象的复制,占用不同的内存空间
如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
序列对象的切片其实是浅拷贝,即只拷贝顶级的对象
要想知道两者的区别,首先要知道什么是可变类型和不可变类型?
不可变类型:整型,长整型,浮点数,复数,布尔,字符串,元组
可变类型:列表,字典。
深浅拷贝有什么区别那?
1、如果用copy.copy、copy.deepcopy对一个全部都是不可变类型的数据进行拷贝,那么它们结果相同,都是引用指向;
2、如果拷贝的是一个拥有不可变类型的数据,即使元组是最顶层,那么deepcopy依然是深拷贝,而copy.copy还是指向
3、基本上只要不是我们自已手动调用的deepcopy方法都是浅拷贝,切片拷贝字典拷贝都是浅拷贝,而有些内置函数可以生成拷贝(list),属于深拷贝:a = list(range(10))
b = list(a)
练习题1
import copy
list1 = [1,2,['a','b'],('c','d')]
list2 = list1
list3 = copy.copy(list1)
list4 = copy.deepcopy(list1)
list1.append(3)
tuple1 = (10,10)
list1[2].append({100})
list1[3] = list1[3] + tuple1
dict1 = {}
dict1['1'] = 1111
list1[2].append(dict1)
print(list1)
print(list2)
print(list3)
print(list4)
详解:
#list1=list2,所以list1和list2指向同一个列表,两者内容一样 (1) [1,2,[‘a’,‘b’,{100},{‘1’:1111}],(‘c’,‘d’,10,10)] (2) [1,2,[‘a’,‘b’,{100},{‘1’:1111}],(‘c’,‘d’,10,10)]
#list3=copy.copy(list1),浅拷贝,列表内列表复制的是引用,会随着list1内列表的内容改变而一起改变,元组不可变 (3) [1,2,[‘a’,‘b’,{100},{‘1’:1111}],(‘c’,‘d’)]
#list4=copy.deepcopy(list1),深拷贝,导致list4是独立全新复制的一份独立的内容,不会随着list1的变化而改变 (4) [1,2,[‘a’,‘b’],(‘c’,‘d’)]
练习题2
import copy
a = [11,22,33]
b = [44,55,66]
c = [a,b]
d = copy.copy(c)
e = copy.deepcopy(c)
a.append(111)
c.append(55)
print(d)
print(e)
详解:
浅拷贝顶层拷贝d = [[11, 22, 33, 111], [44, 55, 66], 55]
深拷贝递归拷贝e = [[11, 22, 33], [44, 55, 66]]