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爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
浅谈Python的Django框架中的缓存控制
Jul 24 Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
python实现维吉尼亚加密法
Mar 20 Python
centos 安装Python3 及对应的pip教程详解
Jun 28 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
python os.fork() 循环输出方法
Aug 08 Python
python 写一个性能测试工具(一)
Oct 24 Python
python中函数返回多个结果的实例方法
Dec 16 Python
python游戏开发Pygame框架
Apr 22 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 在线翻译函数代码
2009/05/07 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
PHP 数据结构 算法 三元组 Triplet
2011/07/02 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
用javascript实现画板的代码
2007/09/05 Javascript
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
Vue发布项目实例讲解
2019/07/17 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
python中随机函数random用法实例
2015/04/30 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python实现祝福弹窗效果
2019/04/07 Python
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
应届生.NET方向面试题
2015/05/23 面试题
销售自荐信
2013/10/22 职场文书
经济与贸易专业应届生求职信
2013/11/19 职场文书
卫生安全检查制度
2014/02/04 职场文书
会计电算化实训报告
2014/11/04 职场文书
先进集体申报材料
2014/12/25 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
win10更新失败无限重启解决方法
2022/04/19 数码科技