详解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元组操作实例解析
Sep 23 Python
python类继承用法实例分析
May 27 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
Python利用turtle库绘制彩虹代码示例
Dec 20 Python
Python建立Map写Excel表实例解析
Jan 17 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
python日期相关操作实例小结
Jun 24 Python
pandas计算最大连续间隔的方法
Jul 04 Python
python3 实现口罩抽签的功能
Mar 11 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
win10安装python3.6的常见问题
Jul 01 Python
M1芯片安装python3.9.1的实现
Feb 02 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中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
js倒计时小程序
2013/11/05 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
canvas绘制七巧板
2017/02/03 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
简单的Python2.7编程初学经验总结
2015/04/01 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
广告学毕业生求职信
2014/01/30 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书