当前位置:首页 > 面试大全 > python如何实现提问并回答

python如何实现提问并回答

7个月前 (05-20)54

这三大经典Python面试题,最基础,却最常被面试官问!很多时候,我们在面试的时候,出其不意的面试官会问一些基础的问题,但你还不一定会,这时就会很尴尬了!

Python面试题(一)之交换变量值

平时时不时会面面实习生,大多数的同学在学校里都已经掌握了Python。面试的时候要求同学们实现一个简单的函数,交换两个变量的值,大多数的同学给出的都是如下的答案:

实际上,Python中还有更简洁的更具Python风格的实现,如下:

相比前一种方法,后一种方法节省一个中间变量,在性能上也优于前一种方法。

我们从Python的字节码来深入分析一下原因。

dis是个反汇编工具,将Python代码翻译成字节码指令。这里的输出如下:

通过字节码可以看到,swap1和swap2最大的区别在于,swap1中通过ROT_TWO交换栈顶的两个元素实现x和y值的互换,swap2中引入了tmp变量,多了一次LOAD_FAST, STORE_FAST的操作。执行一个ROT_TWO指令比执行一个LOAD_FAST+STORE_FAST的指令快,这也是为什么swap1比swap2性能更好的原因。

Python面试题(二) is 和 == 的区别

面试实习生的时候,当问到 is 和 == 的区别时,很多同学都答不上来,搞不清两者什么时候返回一致,什么时候返回不一致。本文我们来看一下这两者的区别。

我们先来看几个例子:

上面的输出结果中为什么有的 is 和 == 的结果相同,有的不相同呢?我们来看下官方文档中对于 is 和 == 的解释。

官方文档中说 is 表示的是对象标示符是否一致,也就是比较两个对象在内存中的地址是否一样,而 == 是用来检查两个对象是否相等。

我们在检查 a is b 的时候,其实相当于检查 id(a) == id(b)。而检查 a == b 的时候,实际是调用了对象 a 的 eq() 方法,a == b 相当于 a.eq(b)。

一般情况下,如果 a is b 返回True的话,即 a 和 b 指向同一块内存地址的话,a == b 也返回True,即 a 和 b 的值也相等。

好了,看明白上面的解释后,我们来看下前面的几个例子

打印出 id(a) 和 id(b) 后就很清楚了。只要 a 和 b 的值相等,a == b 就会返回True,而只有 id(a) 和 id(b) 相等时,a is b 才返回 True。

这里还有一个问题,为什么 a 和 b 都是 “hello” 的时候,a is b 返回True,而 a 和 b都是 “hello world” 的时候,a is b 返回False呢?

这是因为前一种情况下Python的字符串驻留机制起了作用。对于较小的字符串,为了提高系统性能Python会保留其值的一个副本,当创建新的字符串的时候直接指向该副本即可。所以 “hello” 在内存中只有一个副本,a 和 b 的 id 值相同,而 “hello world” 是长字符串,不驻留内存,Python中各自创建了对象来表示 a 和 b,所以他们的值相同但 id 值不同。

同学指出:intern机制和字符串长短无关,在交互模式下,每行字符串字面量都会申请一个新字符串,但是只含大小写字母、数字和下划线的会被intern,也就是维护了一张dict来使得这些字符串全局唯一)

总结一下,is 是检查两个对象是否指向同一块内存空间,而 == 是检查他们的值是否相等。可以看出,is 是比 == 更严格的检查,is 返回True表明这两个对象指向同一块内存,值也一定相同。

看到这里,大家是不是搞懂了 is 和 == 的区别呢?

那我们深入一步来思考一下下面这个问题:

Python里和None比较时,为什么是 is None 而不是 == None 呢?

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)) # 输出 140127132522040

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

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

python学习网,免费的在线学习python平台,欢迎关注!

作者:weixin_39698255
来源链接:https://blog.csdn.net/weixin_39698255/article/details/110697438

“python如何实现提问并回答” 的相关文章

2020面试自动化测试面试题【含答案】

2020面试自动化测试面试题【含答案】

1、你做了几年的测试、自动化测试,说一下 selenium 的原理是什么? 我做了五年的测试,1年的自动化测试; selenium 它是...

《OD面试》Java面试题整理

《OD面试》Java面试题整理

一、面试考察点 1 主语言本身 2 数据库 3 算法 4 Spring/SpringMVC/MyBatis...

Java类与对象初始化的过程(一道经典的面试题)

Java类与对象初始化的过程(一道经典的面试题)

首先,Java代码有个特点,就是成员变量可以在前面的方法中使用,在后面定义。这一特性,很多人说Java了不起,可是为什么呢?Java为何能够这样呢? 本文不再以Clas...

慌了,面试居然被问到怎么做高并发系统的限流?

慌了,面试居然被问到怎么做高并发系统的限流?

作者:nick hao 原文链接:cnblogs.com/haoxinyue/p/6792309.html 开涛大神在博客中说过:在开发高并发系统时...

python编程题-python编程题库

python编程题-python编程题库

广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 上期题目连接:1000道python...

100道java基础面试题

100道java基础面试题

不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题。   1.什么是B/S架构?什么是C/S架构 B/S(Brow...

Java 面试题 [MD]

Java 面试题 [MD]

博文地址 我的GitHub 我的博客 我的微信 我的邮箱...

金蝶软件Java试题,金蝶面试题

第一部分java基础 一、选择题(单选)(12题共24分) 1、以下哪项不属于java基础数据类型 (A) int, short, byte...

2018最新JAVA基础面试题和高级面试题

2018最新JAVA基础面试题和高级面试题

Java面试高级篇—Java NIO:浅析I/O模型面试题15期 Java面试高级篇—详谈Java四种线程池及new Thread的弊端面试题14期...

面试题系列:你的系统如何支撑高并发?

  (1)一道面试题的背景引入   这篇文章,我们聊聊大量同学问我的一个问题,面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发?...