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中的Django框架中进行字符串翻译
Jul 27 Python
Python 私有函数的实例详解
Sep 11 Python
用python写扫雷游戏实例代码分享
May 27 Python
django框架自定义用户表操作示例
Aug 07 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
python实现程序重启和系统重启方式
Apr 16 Python
学习python需要有编程基础吗
Jun 02 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 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 JSON 数据解析代码
2010/05/26 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
jquery自定义函数的多种方法
2014/01/09 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
js简易版购物车功能
2017/06/17 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
详解Javascript 中的 class、构造函数、工厂函数
2017/12/20 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
实例讲解Python中的私有属性
2014/08/21 Python
20招让你的Python飞起来!
2016/09/27 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
Python数据存储之 h5py详解
2019/12/26 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
业务员岗位职责范本
2013/12/15 职场文书
电气工程师岗位职责
2014/01/01 职场文书
经典毕业生求职信
2014/07/12 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
任命书格式模板
2015/09/22 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
Golang中异常处理机制详解
2021/06/08 Golang
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
i7 6700处理器相当于i5几代
2022/04/19 数码科技