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 28 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
Apr 20 Python
python之Socket网络编程详解
Sep 29 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
python使用 __init__初始化操作简单示例
Sep 26 Python
创建Shapefile文件并写入数据的例子
Nov 26 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
Python数据可视化:泊松分布详解
Dec 07 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
Python递归函数特点及原理解析
Mar 04 Python
Python Json数据文件操作原理解析
May 09 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 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
Zend的MVC机制使用分析(一)
2013/05/02 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
Javascript !!的作用
2008/12/04 Javascript
鼠标经过的文本框textbox变色
2009/05/21 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python简单进程锁代码实例
2015/04/27 Python
Python简单实现enum功能的方法
2016/04/25 Python
scrapy爬虫完整实例
2018/01/25 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
高中生期末评语
2014/01/28 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
股东授权委托书范本
2014/09/13 职场文书
雷锋观后感
2015/06/10 职场文书