Python中is和==的区别详解


Posted in Python onNovember 15, 2018

Python中有很多运算符,今天我们就来讲讲is和==两种运算符在应用上的本质区别是什么。

在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。

is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。

==比较操作符和is同一性运算符区别

==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等,例如下面两个字符串间的比较:

例1.

>>> a = 'cheesezh'
>>> b = 'cheesezh'
>>> a == b
True

is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。通过对下面几个list间的比较,你就会明白is同一性运算符的工作原理:

例2.

>>> x = y = [4,5,6]
>>> z = [4,5,6]
>>> x == y
True
>>> x == z
True
>>> x is y
True
>>> x is z
False
>>>
>>> print id(x)
3075326572
>>> print id(y)
3075326572
>>> print id(z)
3075328140

前三个例子都是True,这什么最后一个是False呢?x、y和z的值是相同的,所以前两个是True没有问题。至于最后一个为什么是False,看看三个对象的id分别是什么就会明白了。

下面再来看一个例子,例3中同一类型下的a和b的(a==b)都是为True,而(a is b)则不然。

例3.

>>> a = 1 #a和b为数值类型
>>> b = 1
>>> a is b
True
>>> id(a)
14318944
>>> id(b)
14318944
>>> a = 'cheesezh' #a和b为字符串类型
>>> b = 'cheesezh'
>>> a is b
True
>>> id(a)
42111872
>>> id(b)
42111872
>>> a = (1,2,3) #a和b为元组类型
>>> b = (1,2,3)
>>> a is b
False
>>> id(a)
15001280
>>> id(b)
14790408
>>> a = [1,2,3] #a和b为list类型
>>> b = [1,2,3]
>>> a is b
False
>>> id(a)
42091624
>>> id(b)
42082016
>>> a = {'cheese':1,'zh':2} #a和b为dict类型
>>> b = {'cheese':1,'zh':2}
>>> a is b
False
>>> id(a)
42101616
>>> id(b)
42098736
>>> a = set([1,2,3])#a和b为set类型
>>> b = set([1,2,3])
>>> a is b
False
>>> id(a)
14819976
>>> id(b)
14822256

通过例3可看出,只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False。

感谢评论中凯风快晴同学的补充:

大家自己试试看a=257,b=257时它们的id还是否会相等。事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了,同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。

总的来说,只有数值型和字符串型,并且在通用对象池中的情况下,a is b才为True,否则当a和b是int,str,tuple,list,dict或set型时,a is b均为False。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之编写类之三子类
Oct 11 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
使用python实现rsa算法代码
Feb 17 Python
Python中datetime模块参考手册
Jan 13 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
Django实现CAS+OAuth2的方法示例
Oct 30 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 20 Python
Python爬虫教程知识点总结
Oct 19 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 Python
Python中垃圾回收和del语句详解
Nov 15 #Python
Matplotlib中文乱码的3种解决方案
Nov 15 #Python
Python使用sorted对字典的key或value排序
Nov 15 #Python
python并发和异步编程实例
Nov 15 #Python
Numpy截取指定范围内的数据方法
Nov 14 #Python
python numpy元素的区间查找方法
Nov 14 #Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 #Python
You might like
配置php网页显示各种语法错误
2013/09/23 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
js 字符串操作函数
2009/07/25 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
Python之re操作方法(详解)
2017/06/14 Python
浅述python2与python3的简单区别
2018/09/19 Python
python matplotlib拟合直线的实现
2019/11/19 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
实习生自荐信范文
2013/11/13 职场文书
工商管理实习生自我鉴定范文
2013/12/18 职场文书
会计职业生涯规划书
2014/01/13 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
超市工作总结范文2014
2014/12/19 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js
了解Redis常见应用场景
2021/06/23 Redis
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript