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正则表达式操作指南(re使用)
Sep 06 Python
python 多进程通信模块的简单实现
Feb 20 Python
用python删除java文件头上版权信息的方法
Jul 31 Python
Python画图学习入门教程
Jul 01 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
python批量下载抖音视频
Jun 17 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
Python更改pip镜像源的方法示例
Dec 01 Python
python利用while求100内的整数和方式
Nov 07 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
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
JS option location 页面跳转实现代码
2008/12/27 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
简化Python的Django框架代码的一些示例
2015/04/20 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python性能测试工具locust的使用
2020/12/28 Python
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
药品质量检测应届生求职信
2013/11/14 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
求职推荐信范文
2015/03/27 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
张思德观后感
2015/06/09 职场文书
生日宴会祝酒词
2015/08/10 职场文书
小学主题班会教案
2015/08/17 职场文书
Tomcat配置访问日志和线程数
2022/05/06 Servers