去面Python开发岗,竟被2个简单问题难倒,Python解释器太坑了

天气不错,我决定去面试!

1. 面试官的问题

面试官问我:

下面的代码返回True还是False

"maishu" == True

这个问题难不倒我,我记得很清楚:

在Python3中

  • None,0,空字符串,空列表,空字典都算是False
  • 所有其他值都是True

所以这么一想,“maishu” == True应该返回True

2. 我错了

可是面试官笑眯眯的打开他的笔记本电脑,运行了下面的代码:

>>> "maishu" == True
False

可为什么下面的代码的结果会打印呢?

if "maishu":
  print("真")
else:
  print("假")

面试官笑眯眯的告诉了我原因:

  • 在if和while等判断中,并不是去做"maishu"==True这样的比较,而是去调用bool(“maishu”)这个函数,而下面的规则是bool函数的逻辑:

  • None,0,空字符串,空列表,空字典都算是False,其他都是True

  • "maishu"==True是调用了字符串str的魔法函数__eq__,这根本就是两个不同的函数,逻辑不同很正常。而且"maishu"是一个字符串,确实不是True啊,所以比较运算符应该返回False。

3. 还有一个坑

我说我理解了,虽然回答错了问题,但是感觉学习到了知识,还是很开心的。

没想到这个问题还没完,面试官又问:

下面的代码是True还是False?

1 == True 

我想了想说:

1是一个数字,True是一个布尔值,比较运算符应该也是False。

可是面试官笑眯眯的打开他的笔记本电脑,运行了下面的代码:

>>> 1 == True
True

怎么会这样呢?这坑还真多。

面试官洋洋得意的说道:

  • True和False这样的布尔值,在Python解释器中就是用数字表示的,True是1,False是0。常用的数据库(比如MySQL)中也是这样表示的。
  • 所以True就是1,返回True才是对的。

4. 第二个问题我又挂了

我感觉这个问题有点偏,心想接下来应该没问题了!

没想到来了这么一个问题:

1.下面的语句最后是True还是False?

a = 198 
b = 198 
print(a is b) 

2.还有下面,是True还是False?

True a = 257 
b = 257 
print(a is b)

3.还有这一段:

# 注意 - 变量a和b的声明要放在同一行。
a = 257;b=257;  
print(a is b)

我想了想,自信的说:

is是比较的内存地址,判断两个对象在内存中是否是同一个对象。上面应该都是False!

面试官笑眯眯的运行了上面的代码:

  • 第一段都是198的时候,a is b返回了True。
  • 第二段都是257的时候,a is b返回了False。
  • 第三段也都是257,但返回的是True

5. 我崩溃了

我彻底崩溃了!这些天天用的东西。我竟然都错了。

然后面试官笑眯眯的说:

1.is关键词是比较两个变量在内存中的地址是否相同,是真正的同一个东西,而不是比较两个东西内容相等。上面的诡异现象是由于Python解释器的优化造成的。

2.Python把一定常见的数字(-5到256)放在一个统一的地方,如果程序中用到了就会直接使用这个统一的地方的数值。198属于这个范围,所以不管我们定义多少不同的变量,实际上都是用的这同一个,放在内存中是同一个地方。

3.而257不属于上面的范围,虽然a和b都是257,但在内存中它们是两个数字。我们is做比较是比较的内存地址,所以是False。如果我们用==做比较,他们比较的是值,就是相同的。

4.那第三段怎么又是True了呢?那是因为Python的解释器还有一个优化,如果两个变量在同一个代码块中(在例子中是同一行),那么为了节省空间,相同的变量也会公用同一个内存空间。所以就又是True了。

6. 面试结果

虽然面试官最后笑眯眯的跟我说:

你人挺好的,以后有时间再联系。

但是只要面试中能学到东西,我觉得还是很值得。对这个面试官充满感激。

😒老子要越挫越勇,慢慢就成了面霸了。

推荐阅读

睡在我上铺的室友用python,一个月挣了我一学期的生活费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值