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 相关文章推荐
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
Python变量作用范围实例分析
Jul 07 Python
python3大文件解压和基本操作
Dec 15 Python
Python中的TCP socket写法示例
May 11 Python
Python socket套接字实现C/S模式远程命令执行功能案例
Jul 06 Python
python实现图片批量压缩程序
Jul 23 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
python 实现按对象传值
Dec 26 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
宝塔更新Python及Flask项目的部署
Apr 11 Python
如何利用python实现Simhash算法
Jun 28 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
php 什么是PEAR?(第三篇)
2009/03/19 PHP
常用PHP框架功能对照表
2014/10/23 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
JavaScript 函数调用规则
2009/09/14 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python实现kMeans算法
2017/12/21 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
违反课堂纪律检讨书
2014/01/19 职场文书
小学数学教学反思
2014/02/02 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
DSP接收机前端设想
2022/04/05 无线电
Python基本知识点总结
2022/04/07 Python
instantclient客户端 连接oracle数据库
2022/04/26 Oracle