详解Python中is和==的区别


Posted in Python onMarch 21, 2019

在Python中一切都是对象。

Python中对象包含的三个基本要素,分别是:

  1. id(身份标识)
  2. type(数据类型)
  3. value(值)

对象之间比较是否相等可以用 == ,也可以用 is 。

is 和 == 都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪?

is 比较的是两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址。

== 比较的是两个对象的内容是否相等,默认会调用对象的 __eq__ 方法。

== 是python标准操作符中的比较操作符,用来比较判断两个对象的值是否相等。

先来看一个例子

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

is 也被叫做同一性运算符,也就是id是否相同。

看下面代码, a和b变量的id不同, 所以 b == a 是True, b is a 是False.

再来看一下他们的id:

>>> id(a)
4364243328
>>> 
>>> id(b)
4364202696

哪些情况下 is 和 == 结果是完全相同的?

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>> a = 1000
>>> b = 10**3
>>> a == b
True
>>> a is b
False
>>>

所以数字类型不完全相同。

那为什么256时相同, 而1000时不同呢?

因为出于对性能的考虑,Python内部做了很多的优化工作,对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫 small_ints 的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。

Python把这些可能频繁使用的整数对象规定在范围 [-5, 256] 之间的小对象放在 small_ints 中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。

>>> c = 'miracle.young'
>>> d = 'miracle.young'
>>> c is d
False
>>> c == d
True
>>> c = 'miracleyoung'
>>> d = 'miracleyoung'
>>> c is c
True
>>> c == d
True

所以字符串类型不完全相同,这个和解释器实现有关。

>>> a = (1,2,3) # a和b为元组类型
>>> b = (1,2,3)
>>> a is b
False
>>> a = [1,2,3] # a和b为list类型
>>> b = [1,2,3]
>>> a is b
False
>>> a = {'miracle':100,'young':1} # a和b为dict类型
>>> b = {'miracle':100,'young':1}
>>> a is b
False
>>> a = set([1,2,3]) # a和b为set类型
>>> b = set([1,2,3])
>>> a is b
False

所以当变量是数字、字符串、元组,列表,字典时,is 和 == 都不相同, 不能互换使用!当比较值时,要使用 ==,比较是否是同一个内存地址时应该使用is。

当然,开发中比较值的情况比较多。

以上所述是小编给大家介绍的Python中is和==的区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
python统计字母、空格、数字等字符个数的实例
Jun 29 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
浅谈Python爬虫基本套路
Mar 25 Python
Python发展简史 Python来历
May 14 Python
简单了解django索引的相关知识
Jul 17 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 Python
python利用 keyboard 库记录键盘事件
Oct 16 Python
浅谈Python的条件判断语句if/else语句
Mar 21 #Python
python使用thrift教程的方法示例
Mar 21 #Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 #Python
详解python使用turtle库来画一朵花
Mar 21 #Python
python中import与from方法总结(推荐)
Mar 21 #Python
python批量创建指定名称的文件夹
Mar 21 #Python
python根据txt文本批量创建文件夹
Dec 08 #Python
You might like
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
js 函数调用模式小结
2011/12/26 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python的print用法示例
2014/02/11 Python
Python实现发送email的几种常用方法
2014/08/18 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
Python基础之文件读取的讲解
2019/02/16 Python
python如何求圆的面积
2020/07/01 Python
详解Python 函数参数的拆解
2020/09/02 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
课程设计心得体会
2013/12/28 职场文书
超市5.1促销活动
2014/01/15 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
工程合作意向书范本
2015/05/09 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL