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制作最美应用的爬虫
Oct 28 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
详解Python3序列赋值、序列解包
May 14 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
python从内存地址上加载python对象过程详解
Jan 08 Python
使用Python发现隐藏的wifi
Mar 04 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
python 实现aes256加密
Nov 27 Python
selenium+headless chrome爬虫的实现示例
Jan 08 Python
详解Python中*args和**kwargs的使用
Apr 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+mysql)
2007/11/23 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
php实现多城市切换特效
2015/08/09 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
jQuery中has()方法用法实例
2015/01/06 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
Python使用剪切板的方法
2017/06/06 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
python构造函数init实例方法解析
2020/01/19 Python
JAVA中的关键字有什么特点
2014/03/07 面试题
如何通过jdbc调用存储过程
2012/04/19 面试题
2014年客房部工作总结
2014/11/22 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
小学同学聚会感言
2015/07/30 职场文书
诚信考试主题班会
2015/08/17 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python