[面试题二]百度资深面试官:python赋值、浅拷贝与深拷贝


作者:暙哥
链接:https://www.nowcoder.com/discuss/203435?toCommentId=3203149
来源:牛客网

文章有点长,大家耐心看看,更多求职面经和校招内推,也可以关注Linker5微信公众号。


更多面试题系列,可查看:
  • 『面试题解』百度资深面试官:如何理解Python垃圾回收机制?http://mrw.so/4TrPon
  • 『面试题解』百度资深面试官为你解题:线程与进程的区别?http://mrw.so/5ocYjU

本期我们继续邀请了来自于百度的资深校招面试官为你解题,欢迎大家持续关注。

内存管理相关的面试一直是面试中的重点考察内容。赋值、深拷贝与浅拷贝是日常编码工作中,需要时常关注的知识点。不小心可是会写出bug哦~


赋值

先来看一段代码,下面两段代码的输出结果会是什么呢?

# case1: 字符串赋值
a = 'linker5'
b = a
a = 'test123'
print('a: {}'.format(a))
print('b: {}'.format(b))

# case2: 列表赋值
c = ['l', 'i', 'n', 'k', 'e', 'r']
d = c
c[0] = 'L'
print('c: {}'.format(c))
print('d: {}'.format(d))

思考中

a: test123

b: linker5

c: ['L', 'i', 'n', 'k', 'e', 'r']

d: ['L', 'i', 'n', 'k', 'e', 'r']

从上面结果可以看到,a的修改没有影响b,但是c的修改了影响了d。这是为什么呢?

首先,非常重要的一点:在python中,都是将“对象的引用(内存地址)”赋值给变量的。其次,在python中有6个标准数据类型,他们分为可变和不可变两类。


不可变类型:该数据类型对象所指定内存中的值不可以被改变。在改变某个对象的值时,由于其内存中的值不可以被改变,所以,会把原来的值复制一份再进行改变,这样就会计算机会开辟一段新的内存空间来存储新的值。如上文中的case1,变量b和a都是字符串对象的引用,当修改变量a或是理解为对a重新赋值时,会赋值一份再进行改变,因此不会影响对象b。

  • Number(数字)

  • String(字符串)

  • Tuple(元组)




可变类型:该数据类型的对象所指定的地址上面的值可以被改变,变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发生开辟新的内存地址行为。如上文中的case2,变量c是一个可变类型对象,其存储的实际是字符对象的引用地址列表,变量d是可变对象列表的另一个引用。所以当发生改变时,会直接改变c变量列表中的对象值,不会重新开辟空间。

  • List(列表)

  • Dictionary(字典)

  • Set(集合)


浅拷贝

首先,我们需要明确一点,浅拷贝和深拷贝之间的区别只适用于容器对象(包含其他对象的对象,如列表或类实例)。对于非容器对象没有区别,都是对象拷贝,相当于重新赋值,生成一个新的对象。


A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.

上面这段话是官方文档上的描述,有2个含义:

1)浅拷贝会创建一个新的容器对象(compound object)

2)对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)


常见的浅拷贝操作有:


  • 使用切片操作[:]

  • 使用工厂函数(如list/dir/set)

  • copy模块的copy()方法


深拷贝


A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.

上面这段话是官方文档上的描述,也是有2个含义:

1)深拷贝和浅拷贝一样,都会创建一个新的容器对象(compound object)

2)和浅拷贝的不同点在于,深拷贝对于对象中的元素,深拷贝都会重新生成一个新的对象


全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
3
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务