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中利用函数装饰器实现备忘功能
Mar 30 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
Python中进程和线程的区别详解
Oct 29 Python
详解python实现线程安全的单例模式
Mar 05 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
谈一谈基于python的面向对象编程基础
May 21 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
python 5个实用的技巧
Sep 27 Python
python 基于opencv操作摄像头
Dec 24 Python
Python中seaborn库之countplot的数据可视化使用
Jun 11 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
DSP接收机前端设想
2021/03/02 无线电
PHP编程函数安全篇
2013/01/08 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
python实现简单神经网络算法
2018/03/10 Python
PyQt5每天必学之组合框
2018/04/20 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
如何在Shell脚本中使用函数
2015/09/06 面试题
财务主管的岗位职责
2013/12/30 职场文书
城建学院毕业生自荐信
2014/01/31 职场文书
Python函数中的不定长参数相关知识总结
2021/06/24 Python