详解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中列表生成式的用法
Mar 31 Python
用map函数来完成Python并行任务的简单示例
Apr 02 Python
Python fileinput模块使用实例
Jun 03 Python
Python实时获取cmd的输出
Dec 13 Python
python pandas dataframe 行列选择,切片操作方法
Apr 10 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
Python理解递归的方法总结
Jan 28 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
Python变量作用域LEGB用法解析
Feb 04 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
第八节 访问方式 [8]
2006/10/09 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
php源码的安装方法和实例
2019/09/26 PHP
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
vue基础之事件v-onclick="函数"用法示例
2019/03/11 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python常用的日期时间处理方法示例
2015/02/08 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
python实现计算器功能
2019/10/31 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
python切割图片的示例
2020/11/12 Python
Python descriptor(描述符)的实现
2020/11/15 Python
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
大学本科生的个人自我评价
2013/12/09 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
生死抉择观后感
2015/06/09 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
安全生产学习心得体会
2016/01/18 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python