Python中is与==判断的区别


Posted in Python onMarch 28, 2017

在 Python 中,比较两个对象(变量)是否相等,可以用 “is” 和 “==” 操作,但它俩有什么区别?什么时候用 “is”,什么时候用 “==” ?在面试时,发现不少候选人很难把这两者完全说清楚,因此在这篇文章中,「Python之禅」将对二者进行深入浅出的对比介绍。

先举个例子

小黄最近手头非常宽裕,花重金购买了一辆 P90D 特斯拉,我们暂且给这车取名叫 "小P" ,这辆车和隔壁老王家的车(车名叫 "小 王")是一模一样的,无论是型号、外表还是价格都一样,是同批次生产的。这里我们可以说 "小P" 和"小王"是两辆一模一样的、相等的( euqal ),但本质上这是两个不同的对象。有一天小君给他的爱车又取了一个网名叫 "爱驹",当我们说 "小P" 的时候其实就是在讨论 "爱驹",因为本质上两个名字指的是同一个对象,这里我们把 "小P" 和 "爱驹" 称为完全相等的( identical )。

在 Python 中,”==” 和 “is” 的区别可类比这个例子 ,前者是相等性比较,比较的是两个对象中的值是否相等,后者是一致性比较,比较的是两个对象的内存空间地址是否相同。

​显然,如果内存地址相同,那么他们的值肯定也是一样的,因此,如果 “is” 返回 True,那么 “==” 一定也返回 True,反之却不成立。

talk is cheap, show me the code

先创建一个列表对象,然后给它指定一个名字 a,再定义另外一个变量 b,让它指向同一个对象。

>>> a = [1, 2, 3]
>>> b = a

a 和 b 打印的值都是相等的,因为这两个变量指向的是同一个对象,就好比给一辆车起了两个不同的名字。

>>> a
[1, 2, 3]
>>> b
[1, 2, 3]

理所当然, is 和 == 都返回 True。

>>> a == b
True
>>> a is b
True

创建一个新的对象,尽管值是一样的,但是他们本质上是两个不同的对象,处在两个不同的内存空间,因此 "is" 返回的是 False。

>>> c = [1,2,3]
>>> a is c
False

有且当仅比较的两个变量指向同一个对象时 "is" 才返回 True,而 "==" 最终取决于对象的 __eq__() 方法,本质上两个变量进行 "==" 比较操作调用的是对象的 __eq__() 方法。例如:

>>> class Foo(object):
    def __eq__(self, other):
      return True

>>> f = Foo()
>>> f == 1
True
>>> f == None
True
>>> f is None
False

因为自定义类 Foo 的 eq 方法恒返回 True,因此它与任何对象进行 "==" 都是返回 True。而它与 None 是两个不同的对象,因此 'is' 操作返回的是 False。

最后请大家思考这段代码,为什么同样的操作会有不同的结果

>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 123
>>> b = 123
>>> a is b
True

总结:

如果你要比较两个值是否相同就用==,如果比较是否是同一个对象就用is.

其实python中的is比较的对象很像C语言中的指针,只有地址相同的指针才是同一个指针.

Python 相关文章推荐
socket + select 完成伪并发操作的实例
Aug 15 Python
Python中利用xpath解析HTML的方法
May 14 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
May 24 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
python celery分布式任务队列的使用详解
Jul 08 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
用Python生成HTML表格的方法示例
Mar 06 Python
python函数调用,循环,列表复制实例
May 03 Python
Pandas的Apply函数具体使用
Jul 21 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Python保存并浏览用户的历史记录
Apr 29 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 #Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 #Python
python递归查询菜单并转换成json实例
Mar 27 #Python
Python中的命令行参数解析工具之docopt详解
Mar 27 #Python
Python使用PDFMiner解析PDF代码实例
Mar 27 #Python
详解python并发获取snmp信息及性能测试
Mar 27 #Python
使用Python写CUDA程序的方法
Mar 27 #Python
You might like
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
PHP分页函数代码(简单实用型)
2010/12/02 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
laravel入门知识点整理
2020/09/15 PHP
My Desktop :) 桌面式代码
2008/12/29 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python实现DES加密解密方法实例详解
2015/06/30 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
详解Python模块化编程与装饰器
2021/01/16 Python
运动会广播稿500字
2014/01/28 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
Python面向对象之内置函数相关知识总结
2021/06/24 Python
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL