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数据结构之单链表详解
Sep 12 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
Python如何读取文件中图片格式
Jan 13 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 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中的UNICODE 编码与解码
2013/06/29 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
php获取远程文件内容的函数
2015/11/02 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
SVG描边动画
2017/02/23 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
Python二进制串转换为通用字符串的方法
2018/07/23 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
Django实现网页分页功能
2019/10/31 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
橄榄树药房:OLIVEDA
2019/09/01 全球购物
欢迎词怎么写
2015/01/23 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
基于Python编写一个监控CPU的应用系统
2022/06/25 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android