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 相关文章推荐
Python语言编写电脑时间自动同步小工具
Mar 08 Python
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
Python实现的ini文件操作类分享
Nov 20 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
Python使用sftp实现上传和下载功能(实例代码)
Mar 14 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
Python任务自动化工具tox使用教程
Mar 17 Python
python 串行执行和并行执行实例
Apr 30 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 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
PHP实现执行外部程序的方法详解
2017/08/17 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
简明json介绍
2008/09/28 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
深入理解Python中各种方法的运作原理
2015/06/15 Python
Python实时获取cmd的输出
2015/12/13 Python
详解python时间模块中的datetime模块
2016/01/13 Python
python中defaultdict的用法详解
2017/06/07 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
Python列表如何更新值
2020/05/27 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
办公室人员先进事迹
2014/01/27 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
学校课外活动总结
2014/05/08 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
基层党员对照检查材料
2014/09/24 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
起诉意见书范文
2015/05/19 职场文书
公司人事管理制度
2015/08/05 职场文书
初中语文教学反思范文
2016/03/03 职场文书
python如何获取网络数据
2021/04/11 Python
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis