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删除n行后的其他行方法
Jan 28 Python
Python子类继承父类构造函数详解
Feb 19 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
python的re模块使用方法详解
Jul 26 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
用Python写一个自动木马程序
Sep 17 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
keras使用Sequence类调用大规模数据集进行训练的实现
Jun 22 Python
Django集成MongoDB实现过程解析
Dec 01 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小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
YII路径的用法总结
2014/07/09 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
vue 中的keep-alive实例代码
2018/07/20 Javascript
微信小程序嵌入腾讯视频源过程详解
2019/08/08 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
在Python中使用模块的教程
2015/04/27 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
简单了解python的break、continue、pass
2019/07/08 Python
Python Gitlab Api 使用方法
2019/08/28 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
Ruby如何实现动态方法调用
2012/11/18 面试题
《曹刿论战》教学反思
2014/03/02 职场文书
企业文明单位申报材料
2014/05/16 职场文书
十佳家长事迹材料
2014/08/26 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
Python IO文件管理的具体使用
2022/03/20 Python
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL