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-嵌套列表list的全面解析
Jun 08 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
python算法表示概念扫盲教程
Apr 13 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
python3 下载网络图片代码实例
Aug 27 Python
python银行系统实现源码
Oct 25 Python
Python函数参数类型及排序原理总结
Dec 19 Python
Python无头爬虫下载文件的实现
Apr 02 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
解决Python 写文件报错TypeError的问题
Oct 23 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
再次研究下cache_lite
2007/02/14 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
Python3中多线程编程的队列运作示例
2015/04/16 Python
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python实现文件复制删除
2016/04/19 Python
python感知机实现代码
2019/01/18 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
python基于property()函数定义属性
2020/01/22 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
用Python 执行cmd命令
2020/12/18 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
消防应急演练方案
2014/02/12 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
vue实现登陆页面开发实践
2022/05/30 Vue.js