Python面试之 is 和 == 的区别

强哥

亿贝软件工程(上海)有限公司 全栈工程师

​关注他

契卡

在读笛卡尔的孟德

等 1,210 人赞同了该文章

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

我们先来看几个例子:

a = "hello"
b = "hello"
print(a is b)  # 输出 True
print(a == b)  # 输出 Truea = "hello world"
b = "hello world"
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = a
print(a is b)  # 输出 True
print(a == b)  # 输出 True 

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

官方文档中说 is 表示的是对象标示符(object identity),而 == 表示的是相等(equality)。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 的值也相等。

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

a = "hello"
b = "hello"
print(id(a))   # 输出 140506224367496
print(id(b))   # 输出 140506224367496
print(a is b)  # 输出 True
print(a == b)  # 输出 Truea = "hello world"
b = "hello world"
print(id(a))   # 输出 140506208811952
print(id(b))   # 输出 140506208812208
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))   # 输出 140506224299464
print(id(b))   # 输出 140506224309576
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = a
print(id(a))   # 输出 140506224305672
print(id(b))   # 输出 140506224305672
print(a is b)  # 输出 True
print(a == b)  # 输出 True 

打印出 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面试之 is 和 == 的区别相关推荐

  1. 全栈工程师对Python面试中is和==的区别做出解释!看完真的学到了

    面试实习生的时候,当问到 is 和 == 的区别时,很多同学都答不上来,搞不清两者什么时候返回一致,什么时候返回不一致.本文我们来看一下这两者的区别. 我们先来看几个例子: 上面的输出结果中为什么有的 ...

  2. python面试技巧_经典7大Python面试题!看完考官竟然给了我30k的薪资

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

  3. 【Python面试】 说说4种常用编码的区别?

    前两题: [Python面试]谈谈对 Python 和其他语言的区别? [Python面试]说说 Python 解释器种类以及特点? 废话不多说,开始今天的题目: 问:说说ASCII,Unicode, ...

  4. python2中xrange比range优点_【Python面试】 说说Python中xrange和range的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  5. python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  6. 【Python面试】 说说Python中xrange和range的区别?

    往期面试题: 谈谈对 Python 和其他语言的区别? 说说4种常用编码的区别? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 废话不多说,开始今天的题目: 问:说说Pyth ...

  7. python中bytearray和java中byte[]的区别_Python经典面试题:说说Python中xrange和range的区别?...

    昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了. 废话不多说,开 ...

  8. python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...

    [摘要]今天给大家解答一道Python常见的面试题,希望这个面试栏目,给那些准备面试的同学,提供一点点帮助!小编会从最基础的面试题开始,每天一题.如果参考答案不够好,或者有错误的话,麻烦大家可以在留言 ...

  9. python人工智能方向面试准备_高薪直通车丨人工智能+Python面试经验分享(西安**思数据)...

    原标题:高薪直通车丨人工智能+Python面试经验分享(西安**思数据) 高薪直通车 python面试经验分享(西安**思数据 ) 高薪直通车是西安校区独家打造,用于分享西安市场企业面试需求,直击面试 ...

最新文章

  1. linux教程 nfs,[原创]linux视频教程之NFS
  2. mysql 织梦 索引_Mysql索引详解 建立索引的优势劣势以及索引规范
  3. MapReduce简述、工作流程
  4. 振子天线三维方向图 matlab仿真,1阵列天线方向图的MATLAB实现
  5. canal mysql5.6_超详细的Canal入门,看这篇就够了!
  6. 告别相杀!面向对象和函数式编程共存
  7. JSK-2 整除问题【入门】
  8. Leetcode 690
  9. 蓝桥杯题目练习(加法运算)
  10. 一个快播倒下去,千千万万个快播站起来
  11. 统计学课程学习【理论】数据的图标展示
  12. r语言nonzerocoef函数_R语言如何做COX回归分析和nomogram?
  13. html5网页特效-水墨动画
  14. UE4 全局变量的应用(蓝图)
  15. 微信小程序Radio为一组时,使用三元表达式始终选中默认值
  16. 翼龙贷——优化经验分享
  17. python脚本文件的扩展命是什么_一些文件的扩展名
  18. 北京地铁客流数据特征分析
  19. EhCache常用配置详解和持久化硬盘配置
  20. 计算机图表应用样式,将在 Microsoft Office 早期版本中创建的图表转换为 SmartArt 图形或形状...

热门文章

  1. 重磅!新一轮“双一流”,有重大变化!
  2. U-Net 3+: 全尺度的跳跃连接的 UNet
  3. COCO新记录:60.6AP!微软提出采用注意力机制进行检测头统一的Dynamic Head
  4. EPSON机械臂TCP通讯,实现手眼标定(附EPSON代码)
  5. OpenCV java 图片处理,蒙太奇图片(13)
  6. 微软联合创始人都看好,这项技术有什么过人之处?
  7. java中的几个概念的比较
  8. 拿到offer可以不去吗_2020应届毕业生求职难吗?不难!教你四招,拿到心动的Offer...
  9. 科研文献|中国的肠道微生物群及其与主食类型、民族和城市化的关系
  10. ISME: 中科院南京土壤所褚海燕组揭示关键菌群的生物多样性决定作物产量