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实现的文件夹清理程序分享
Nov 22 Python
Python中循环引用(import)失败的解决方法
Apr 22 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
python交互界面的退出方法
Feb 16 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
使用python+whoosh实现全文检索
Dec 09 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
python对文件的操作方法汇总
Feb 28 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
python导入库的具体方法
Jun 18 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
关于Python中进度条的六个实用技巧分享
Apr 05 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
python连接mongodb密码认证实例
2018/10/16 Python
用Python实现数据的透视表的方法
2018/11/16 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Delphi工程师笔试题
2013/09/21 面试题
年度评优评先方案
2014/06/03 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
出差报告格式模板
2014/11/06 职场文书
罚站检讨书
2015/01/29 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
病房管理制度范本
2015/08/06 职场文书
七年级作文之下雨天
2019/12/23 职场文书
python实现简单的聊天小程序
2021/07/07 Python