失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 经典4大Python面试题!初级者 你所需知的(附标准答案)-下篇

经典4大Python面试题!初级者 你所需知的(附标准答案)-下篇

时间:2019-09-10 22:07:37

相关推荐

经典4大Python面试题!初级者 你所需知的(附标准答案)-下篇

Python面试(三)可变对象和不可变对象

上一个面试题:Python面试之 is 和 == 的区别的最后留了一个问题:

Python里和None比较时,为什么是 is None 而不是 == None 呢?这是因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。而 == None背后调用的是__eq__,而__eq__可以被重载,下面是一个 is not None但 == None的例子

好了,解答就到这里,我们开始本篇的正题。

Python中有可变对象和不可变对象之分。可变对象创建后可改变但地址不会改变,即变量指向的还是原来的变量;不可变对象创建之后便不能改变,如果改变则会指向一个新的对象。

Python中dict、list是可变对象,str、int、tuple、float是不可变对象。

来看一个字符串的例子

上面的例子里,修改a指向的对象的值会导致抛出异常。

执行 a = a + ' world'时,先计算等号右边的表达式,生成一个新的对象赋值到变量a,因此a指向的对象发生了改变,id(a) 的值也与原先不同。

再来看一个列表的例子

上面对a修改元素、添加元素,变量a还是指向原来的对象。

将a赋值给b后,变量b和a都指向同一个对象,因此修改b的元素值也会影响a。

变量c是对b的切片操作的返回值,切片操作相当于浅拷贝,会生成一个新的对象,因此c指向的对象不再是b所指向的对象,对c的操作不会改变b的值。

理解了上面不可变对象和可变对象的区别后,我们再来看一个有趣的问题

明明group1和group2是不同的对象(id值不同),为什么调用group2的add_member方法会影响group1的members?

其中的奥妙就在于__init__函数的第二个参数是默认参数,默认参数的默认值在函数创建的时候就生成了,每次调用都是用了这个对象的缓存。我们检查id(group1.mebers)和id(group2.members),可以发现他们是相同的

print(id(group1.members)) # 输出 140127132522040print(id(group2.members)) # 输出 140127132522040

所以,group1.members和group2.members指向了同一个对象,对group2.members的修改也会影响group1.members。

那么问题来了,怎样修改代码才能解决上面默认参数的问题呢?

Python面试(四)连接字符串用join还是+

连接字符串的时候可以用join也可以用+,但这两者有没有区别呢?

我们先来看一下用join和+连接字符串的例子

两者的结果是一样,那么考虑这样一个问题,这两者在性能上有区别吗?

我们来做个实验,比较下join和+的性能

上面的程序有如下的输出

join: 0.116944, plus: 0.394379

可以看到,join的性能明显好于+。这是为什么呢

如果觉得《经典4大Python面试题!初级者 你所需知的(附标准答案)-下篇》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。