深拷贝与浅拷贝的效率(两分钟理解深拷贝和浅拷贝)
深拷贝与浅拷贝的效率(两分钟理解深拷贝和浅拷贝)list2=copy.deepcopy(list1)list1=[1 [2 3]]浅拷贝生成的列表如果修改的不是第一层变量,复制的列表会随之改变,但是如果改变的是第一层的变量,新列表不会修改演示代码:import copy
前面我们曾经聊到列表从内存的角度是什么样的?有兴趣的可以关注我,看一下《python之从内存读写的角度,学习并玩转list》章节的内容。今天我们依然从内存图出发,带你看一下内存深处的关于深拷贝和浅拷贝的那些奥秘。
深拷贝和浅拷贝第一点,深拷贝和浅拷贝的解释深拷贝:复制整个依赖的变量
浅拷贝:复制过程中只复制一层变量,不会复制深层变量所绑定的变量
第二点,深拷贝和浅拷贝的区别深拷贝生成的新的列表和原列表没有关系
浅拷贝生成的列表如果修改的不是第一层变量,复制的列表会随之改变,但是如果改变的是第一层的变量,新列表不会修改
第三点,深拷贝和浅拷贝的内存图1.1 深拷贝内存图案例演示代码:
import copy
list1=[1 [2 3]]
list2=copy.deepcopy(list1)
list1[1][0]=100
print list2[1][0]
上图表示的是list2的深拷贝实现
上图表示修改了list1[1][0]=100,此时对list2没有任何影响。
所以list2[1][0]=2
1.2 代码解读 2.1 浅拷贝内存图案例演示代码:
import copy
list1=[1 [2 3]]
list2=copy.copy(list1)
list1[1][0]=100
print list2[1][0]
上图表示的list2的浅拷贝
上图表示修改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 代码解读注意:
一、如果此时修改的是list[0]=100 list2[0]不会随之改变,因为list2复制的是list1的一层地址。
二、通常所使用的的list2=list1[:],是浅拷贝。
【二哥有话说】知识在于一点一滴的积累,学习也是一个循序渐进的过程。关注我,小主会为大家分享更多职场干货和职场故事。