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实现把json格式转换成文本或sql文件
Jul 10 Python
python使用psutil模块获取系统状态
Aug 27 Python
用Pygal绘制直方图代码示例
Dec 07 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
pycharm 安装JPype的教程
Aug 08 Python
Python学习笔记之While循环用法分析
Aug 14 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
python关于调用函数外的变量实例
Dec 26 Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 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中的观察者模式
2010/03/24 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
python实现多张图片拼接成大图
2019/01/15 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
大学生毕业的自我鉴定
2013/11/13 职场文书
表扬信格式
2014/01/12 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
小学教师自我评价
2015/03/04 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
2015年加油站工作总结
2015/05/13 职场文书
中国合伙人观后感
2015/06/02 职场文书
开天辟地观后感
2015/06/09 职场文书
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android