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 多进程通信模块的简单实现
Feb 20 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
详解Django中间件的5种自定义方法
Jul 26 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
python遍历小写英文字母的方法
Jan 02 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
基于python3 的百度图片下载器的实现代码
Nov 05 Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 Python
Python多线程多进程实例对比解析
Mar 12 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
Python celery原理及运行流程解析
Jun 13 Python
基于python实现操作git过程代码解析
Jul 27 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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
php多重接口的实现方法
2015/06/20 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
python中类的一些方法分析
2014/09/25 Python
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python实现CET查分的方法
2015/03/10 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
基于Pytorch SSD模型分析
2020/02/18 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
公益广告语集锦
2014/03/13 职场文书
保护环境建议书100字
2014/05/13 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
怎样写辞职信
2015/02/27 职场文书
员工自我工作评价
2015/03/06 职场文书
优秀大学生自荐信
2015/03/26 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
详解Python生成器和基于生成器的协程
2021/06/03 Python