自动化测试面试官:浅拷贝和深拷贝有什么区别?

2021-03-20  本文已影响0人  程序员阿沐

那我们今天再来看一下这个面试问题:浅拷贝和深拷贝有什么区别?

你如果说到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、本文章学习资源,均可以免费分享。

微信公号:程序员一凡。这样的好内容,里面还有近百篇。  谢谢你的支持!

上一篇下一篇

猜你喜欢

热点阅读