联想常问面试题,深拷贝和浅拷贝的区别?你都不知道

目录

•一、Python 一行代码实现 1 到 100 之和•二、drop,truncate,delete区别•三、Python中深拷贝和浅拷贝的区别是啥?

一、Python 一行代码实现 1 到 100 之和

使用 Python 的内置求和函数 sum,sum()函数第一个参数接受可迭代的对象,如列表,字典等。

然后考虑使用 range(),列表推导式生成1到100的数字列表:

print(sum([i for i in range(1,101)])

靠谱参考链接,复制到百度打开:

https://blog.csdn.net/qq_40808154/article/details/94136325

二、drop,truncate,delete区别

drop(删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉。

以后要新增数据是不可能的,除非新增一个表。

truncate(清空表中的数据) :删除内容,释放空间但不删除定义(保留表的数据结构)

与drop不同的是,只是清空表数据而已。

注意: truncate不能删除行数据,要删就要把表清空。

delete(删除表中的数据):

delete语句用于删除表中的行。

delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行回滚操作。

靠谱参考链接,复制到百度打开:

https://www.cnblogs.com/fjl0418/p/7929420.html

三、Python中深拷贝和浅拷贝的区别是啥?

群友回复,仅供参考:

深:完全是新的,和原来没关系。
浅:只是拷贝过去一个引用。

拷贝的是内存地址值。

深拷贝就是开辟一个新的内存空间。

以上回答,小编觉得较为靠谱,面试可以这样简单的回答。

什么是深拷贝?什么是浅拷贝?或者是普通的赋值,和这两者间的联系与区别到底是啥?

1.浅拷贝

通过代码来看下:

a=[1,2,3[1,2,3[5,6]]]
这是一个双重嵌套的列表。这是个大列表,大列表的第四个元素是一个列表。同时这个列表里面的第四个元素又是个列表。
图片来自网络,图片中的字是小编编辑的

如果把a复制给b的话:

图片来自网络

在Python内部实现里面,如果让b=a,直接把a引向的list,让b也引向这同一个对象。

在这样一个b=a的赋值的结果里面,不管是改变a指向的列表还是b指向的列表,另外一个都会被改变,因为它们指向的都是同一个列表。

c=a.copy

这样c和b的差别就看出来了:

图片来自网络

c指向的列表和a、b不是同一个列表了。

但是这个列表里面的元素,指向的仍然是同一个元素。

所以这个.copy,这个浅拷贝意味着在指向的这个对象的第一层的层面上进行了赋值。

在这个容器内部如果再有指向别的可变元素的这个对象的话,那么它内部其实并没有赋值。

所以只是第一层数据的一个赋值,再往深层次的数据没有赋值,还是指向原来的这个。

图片来自网络

c[3][0]=9

a和b的第四个元素指向的这个列表也变成了9,2,3的列表。

如果写成c[1]=0,你看到只是改变了它自己,因为它只是在第一层。把c的第二个元素从2改成了0。

图片来自网络

但是a和b没有受到c这层的影响。

在更深层次上,有着共同指向的列表去修改的时候,改这个9的时候,其它的a和b也会受影响。

以上是浅拷贝。

2. 深拷贝

d和前面的a、b、c没有任何共同的地方。

d=copy.deepcopy(a)

图片来自网络

不管这个容器里面嵌套了多少层对象,它会把它一层一层的通过迭代把它全部拷贝出来。

深入得把它复制一份。

d指向的是一个全新的列表,这个列表里面所有的元素指向的可变的元素(其它中的列表中的元素也是全新的)。

d里面做的修改,不管是在哪一层,都不会影响a、b、c所指向的内容。

d[3][0]=100

图片来自网络

这个时候可以看到,它改的是自己的列表内部指向的引用的另外一个列表的这个值。和前面一点关系都没有。

即使是改的更深层次上的,也和a、b、c一点关系都没有。

d[3][3][0]=100

图片来自网络

从这张图中可以清楚得看到:

a是开始定义的一个嵌套列表,b是通过赋值,它们引用上了同一个值。

这个时候,在第一层次上,它们都是共同体,只要有一个改,另外一个也受影响。

c是个浅拷贝。这个浅拷贝可以看到,在第一层上修改互不影响,但是再往深层次,它们又指向相同的了,这个时候就受影响了。

d是个深拷贝,不管多深都是完全重新赋值的一套,这个时候就真正的不受影响。

如果真正想让它们实现互不影响,就用深拷贝。

3.总结

如果用浅拷贝的话,在第一层没问题,但是深层次上,它们指向的是相同的列表,没办法,除非加一行这样的代码:

c[3]=[0,1,2,3]

图片来自网络

这个时候c和前面a、b之间的联系就断了。已经让它指向一个新定的列表。这个时候后面这个跟前面一点关系都没有了。

只要知道在内部,它们之间到底是分还是合,指向的是不同的对象还是相同的对象,同一个地址还是不同的地址,那你就知道该如何去做了。

就知道改哪个,哪些数据会变,哪些数据不会变了。

靠谱参考链接:

https://www.bilibili.com/video/BV1jT4y1G7AN

工具:http://pythontutor.com/visualize.html#mode=edit


注:文章中的链接是本人整理过来的,皆来自网络。链接中的视频、文章版权皆归原作者所有。计算机知识都一样,文章是小编整理的。如有雷同,纯属巧合。

公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 136+原创文章,欢迎关注、交流,禁止第三方擅自转载。如有转载,请标明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清菡软件测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值