详解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之有容乃大的list(4)
Sep 28 Python
Python 模拟登陆的两种实现方法
Aug 10 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
Python实现分段线性插值
Dec 17 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
Python检测数据类型的方法总结
May 20 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
Python分类测试代码实例汇总
Jul 23 Python
详细总结Python常见的安全问题
May 21 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
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
Laravel 5.5 异常处理 & 错误日志的解决
2019/10/17 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
Python文件路径名的操作方法
2019/10/30 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
表彰大会主持词
2014/03/26 职场文书
降消项目实施方案
2014/03/30 职场文书
节约粮食标语
2014/06/18 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis