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 22 Python
浅析Python基础-流程控制
Mar 18 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
浅谈python新式类和旧式类区别
Apr 26 Python
python做反被爬保护的方法
Jul 01 Python
简单了解python的内存管理机制
Jul 08 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
浅析Python requests 模块
Oct 09 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 Python
全网最全python库selenium自动化使用详细教程
Jan 12 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/02 日漫
php下使用无限生命期Session的方法
2007/03/16 PHP
PHP array操作10个小技巧分享
2011/06/23 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
php连接mysql数据库
2017/03/21 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
Python中操作MySQL入门实例
2015/02/08 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
python with (as)语句实例详解
2020/02/04 Python
如何使用repr调试python程序
2020/02/28 Python
Yahoo的PHP面试题
2014/05/26 面试题
节能标语大全
2014/06/21 职场文书
经济类毕业生求职信
2014/06/26 职场文书
房屋转让协议书
2014/10/18 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电