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压缩和解压缩zip文件
Feb 14 Python
在Python的Flask框架中实现全文搜索功能
Apr 20 Python
Python 自动化表单提交实例代码
Jun 08 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
Python3视频转字符动画的实例代码
Aug 29 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 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中memcache的应用
2013/06/18 PHP
php获取远程文件大小
2015/10/20 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
Python中的lstrip()方法使用简介
2015/05/19 Python
Django自定义认证方式用法示例
2017/06/23 Python
python3操作mysql数据库的方法
2017/06/23 Python
python构建深度神经网络(续)
2018/03/10 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
高校毕业生登记表自我鉴定
2013/11/03 职场文书
预备党员承诺书
2014/03/25 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
计算机专业自荐信
2015/03/05 职场文书
投诉书格式范本
2015/07/02 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书