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开发windows GUI程序入门实例
Oct 23 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
手把手教你python实现SVM算法
Dec 27 Python
详解基于django实现的webssh简单例子
Jul 17 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
Pytorch之Variable的用法
Dec 31 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
通过cmd进入python的步骤
Jun 16 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
python使用shell脚本创建kafka连接器
Apr 29 Python
Python日志模块logging用法
Jun 05 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
快速了解Python相对导入
2018/01/12 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
python下载的库包存放路径
2020/07/27 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
心理健康教育心得体会
2013/12/29 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
文明班级建设方案
2014/05/15 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
单位员工收入证明样本
2014/10/09 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js