那我们今天再来看一下这个面试问题:浅拷贝和深拷贝有什么区别?
你如果说到Python,这个问题会经常被问到(方便理解我们就可以直接把它理解成Ctrl+C/Ctrl+V复制copy)当然在代码里面复制粘贴不仅仅是大家看到的,就是说在代码的世界里面,有很多的东西。
就好像代码里面有一个is == 看起来这两个没有区别
比如说
a is b
a==b
看起来没什么区别,看起来相等。但其实它们有很大的区别。
就好像我们的深复制和浅复制,也是一样的,你导入一个模块(copy)我定义一个a等于一个列表(1,2,3,4)
然后我们去进行浅复制和深复制。
浅复制
b==copy里面的一个方法,
b=copy.copy(a)#浅复制
那这个是浅复制
深复制
C=copy .deepcopy(a)
我们再来打印一下,abc
打印出来都是一模一样的,没有毛病,这个时候大家看不出任何的效果。
那我在前面有说,浅复制深复制他们最明显的区别就是:浅拷贝最基本的,没有拷贝子对象
那什么叫子对象?
所以说这个数据类型就
a=[1,2,3,4]这个列表里面可不可以有列表?比如说我就又定义一个a一个b
a=[1,2,3,4,[ 'a' , 'b ' ]]
打印一下,其实还是一样的,因为它们是一个整体。
那为什么说浅复制没有拷贝子对象呢,我们接着来看
a.去做一个更改,列表可以去添加元素对吧吗,append
这个列表a去添加一个元素,那这是第几个元素?那么索引就是4
我的意思就是a=[1,2,3,4,[ 'a' , 'b ' c' ]]想要在里面再加一个c这样的元素,我们用代码
a[4].append( 'c ')
那我们再来运行看下效果
打印为什么还是三行都是一样的,问题在哪里,是因为在复制在前就把这个元素添加了,你要在复制之后。我去改一下代码顺序,这个时候效果就出来了,这个就是它们之间的区别。
那它们之间的id是不是一样的呢,id肯定也是不一样的,一起来看一下它们之间的id。都是不同的对象了
print(id(a))
print(id(b))
print(id(c))
虽然都是复制过来的,但是它们已经不是同一个东西了,复制过来,打印adc,三个id都不一样了
所以这就是它们之间一些基本的区别,这些代码大家可以在电脑上敲一遍,理解一下。
加深印象:
浅拷贝没有拷贝子对象,就是说我去浅拷贝,它们虽然是一个固定的对象,子对象是统一的,深度拷贝就是两者完全独立了
只要记住深拷贝,你之前是这个样子
我拷贝之后,不管你做什么增删改查,我还是这个样子
完全独立了。
那么浅拷贝就还没有完全独立,子对象还是之前的子对象,我这个子对象加了一个c元素,打印后能显示它添加的子元素,所以你记住深拷贝两者之间完全独立
如果代码接触(敲)的少,看上去好像这个东西很简单,或者这个概念你读一遍也很简单,但是你需要多去敲一些这样的代码,深拷贝浅拷贝在很多语言里面都有,我们自动化,测试框架里面用得还是比较多的。
1、点赞。防止以后找不到,想看的时候,在自己主页就能找到了,很方便;
2、关注我。让我们成为长期关系,下一个视频会分享更多的硬核干货;
3、本文章学习资源,均可以免费分享。
微信公号:程序员一凡。这样的好内容,里面还有近百篇。 谢谢你的支持!
网友评论