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并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
Django csrf 验证问题的实现
Oct 09 Python
Python 移动光标位置的方法
Jan 20 Python
python里运用私有属性和方法总结
Jul 08 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
Python常用数据类型之间的转换总结
Sep 06 Python
Python绘图实现显示中文
Dec 04 Python
用python写爬虫简单吗
Jul 28 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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代码
2012/07/14 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
JS获取父节点方法
2009/08/20 Javascript
jQuery 表单验证扩展(三)
2010/10/20 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
javascript验证身份证号
2015/03/03 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Flask之flask-script模块使用
2018/07/26 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
Python异常处理机制结构实例解析
2020/07/23 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
社区中秋节活动方案
2014/01/29 职场文书
介绍信如何写
2015/01/31 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
MySql分区类型及创建分区的方法
2022/04/13 MySQL