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负载均衡的简单实现方法
Feb 04 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
利用Python如何实现一个小说网站雏形
Nov 23 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
python线程join方法原理解析
Feb 11 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
Django mysqlclient安装和使用详解
Sep 17 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
pycharm2021激活码使用教程(永久激活亲测可用)
Mar 30 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 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
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
原生js实现公告滚动效果
2021/01/10 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
快速了解Python中的装饰器
2018/01/11 Python
简单介绍python封装的基本知识
2019/08/10 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
Python 实现微信自动回复的方法
2020/09/11 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
Linux机考试题
2015/07/17 面试题
民主生活会发言材料
2014/10/20 职场文书
情况说明书怎么写
2015/10/08 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang