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 相关文章推荐
如何搜索查找并解决Django相关的问题
Jun 30 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
简单实现python爬虫功能
Dec 31 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
Python 调用Java实例详解
Jun 02 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
Python 共享变量加锁、释放详解
Aug 28 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
python实现取余操作的简单实例
Aug 16 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安全的URL字符串base64编码和解码
2014/06/19 PHP
ThinkPHP之getField详解
2014/06/20 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
python实现获取Ip归属地等信息
2016/08/27 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
基于python实现雪花算法过程详解
2019/11/16 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
python Selenium 库的使用技巧
2020/10/16 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
《桂花雨》教学反思
2014/04/12 职场文书
结对共建协议书
2014/08/20 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2015感人爱情寄语
2015/02/26 职场文书
同意转租证明
2015/06/24 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
大学军训口号大全
2015/12/24 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书