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实现统计代码行数的方法
May 22 Python
Python实现把数字转换成中文
Jun 29 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
python实现音乐下载器
Apr 15 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
python实现布隆过滤器及原理解析
Dec 08 Python
Numpy数组的广播机制的实现
Nov 03 Python
Python通过Schema实现数据验证方式
Nov 12 Python
Python如何识别银行卡卡号?
Jun 10 Python
python垃圾回收机制原理分析
Apr 13 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网页显示各种语法错误
2013/09/23 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
常用python编程模板汇总
2016/02/12 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
python从Oracle读取数据生成图表
2020/10/14 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
新年晚会主持词
2014/03/24 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
爱国演讲稿400字
2014/05/07 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS
apache ftpserver搭建ftp服务器
2022/05/20 Servers
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL