浅拷贝和深拷贝的区别两分钟理解深拷贝和浅拷贝浅拷贝与深拷贝的区别




浅拷贝和深拷贝的区别两分钟理解深拷贝和浅拷贝浅拷贝与深拷贝的区别

2022-07-21 2:20:56 网络知识 官方管理员

深拷贝和浅拷贝

第一点,深拷贝和浅拷贝的解释

深拷贝:复制整个依赖的变量

浅拷贝:复制过程中只复制一层变量,不会复制深层变量所绑定的变量

第二点,深拷贝和浅拷贝的区别

深拷贝生成的新的列表和原列表没有关系

浅拷贝生成的列表如果修改的不是第一层变量,复制的列表会随之改变,但是如果改变的是第一层的变量,新列表不会修改

第三点,深拷贝和浅拷贝的内存图

1.1深拷贝内存图案例

演示代码:

importcopy

list1=[1,[2,3]]

list2=copy.deepcopy(list1)

list1[1][0]=100

printlist2[1][0]

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(1)

上图表示的是list2的深拷贝实现

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(2)

上图表示修改了list1[1][0]=100,此时对list2没有任何影响。

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(3)

所以list2[1][0]=2

1.2代码解读

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(4)

2.1浅拷贝内存图案例

演示代码:

importcopy

list1=[1,[2,3]]

list2=copy.copy(list1)

list1[1][0]=100

printlist2[1][0]

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(5)

上图表示的list2的浅拷贝

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(6)

上图表示修改list1[1][0]=100,很容易知道list2[1][0]也随之改变,但是如果修改的是list[0]的值,list2[0]的值是不会发生变化的,因为复制的是一层的变量,虽然list1和list2值都是1,但是在内存中的地址空间是不一样的,修改的list1[0],发生改变的是list1的第0号元素的地址,所以对list2没有影响。

所以list2[1][0]=100

2.2代码解读

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(7)

注意:

一、如果此时修改的是list[0]=100,list2[0]不会随之改变,因为list2复制的是list1的一层地址。

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(8)

二、通常所使用的的list2=list1[:],是浅拷贝。

浅拷贝和深拷贝的区别(两分钟理解深拷贝和浅拷贝)(9)

发表评论:

最近发表
网站分类
标签列表