前言
List浅拷贝和深拷贝图解
一、浅拷贝
1、创建一个List_var1的列表
list_var1 = [1, 2, 3, 4]
2、将其复制给List_var2
list_var1 = [1, 2, 3, 4] list_var2 = list_var1
这里我们可以看到它和List_var1指向同一个内存地址
所以List_var1改变List_var2也改变
例如:
给List_var1添加一个元素
3、使用浅拷贝让List_var2不随着List_var1的改变而改变
list_var1 = [1, 2, 3, 4] list_var2 = list_var1 list_var1.append(5) list_var3 = copy(list_var1)
此时这里多了一个list_var3的变量,它指向的是一个新的列表
当我们再次改变list_var1 的时候list_var3是不会发生改变的
list_var1 = [1, 2, 3, 4] list_var2 = list_var1 list_var1.append(5) list_var3 = copy(list_var1) list_var1.append(6)
我们可以看出list_var3并没有改变,list_var3创建了一个新的内存地址
4、但是当list_var1中含有可变元素的时候这时候list_var3就会发生改变
list_var1 = [1, 2, 3, 4,[10,20]] list_var2 = list_var1 list_var1.append(5) list_var3 = copy(list_var1) list_var1.append(6)
list_var3在浅拷贝的时候会将这个可变的元素指向同一个内存地址
这样减少了内存的开销
将可变元素改变,list_var3发生改变 list_var1[4].append(30)
总结:当使用浅拷贝的时候,存在可变数据类型的时候,这个可变数据发生变化浅拷贝的这个数据也会发生改变
二、 深拷贝
1、接上面,使用深拷贝让这两个列表(list_var1和list_var3)没有关系
list_var1 = [1, 2, 3, 4,[10,20]] list_var2 = list_var1 list_var1.append(5) list_var3 = copy(list_var1) list_var1.append(6) list_var4 = deepcopy(list_var1)
这里list_var4 会重新开辟一个内存空间和list_var1没有任何关系
验证list_var1发生改变时list_var4不变
list_var1 = [1, 2, 3, 4,[10,20]] list_var2 = list_var1 list_var1.append(5) list_var3 = copy(list_var1) list_var1.append(6) list_var4 = deepcopy(list_var1) list_var1[4].append(50)
这里给list_var1添加元素,list_var4未发生改变
总结:
深拷贝拷贝的所有的对象
浅拷贝只拷贝父对象