详解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基础教程之缩进介绍
Aug 29 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
Python ftp上传文件
Feb 13 Python
Python编写登陆接口的方法
Jul 10 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
对python生成业务报表的实例详解
Feb 03 Python
python super的使用方法及实例详解
Sep 25 Python
Python threading.local代码实例及原理解析
Mar 16 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
python输出结果刷新及进度条的实现操作
Jul 13 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
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
PHPUnit安装及使用示例
2014/10/29 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
Python中optparser库用法实例详解
2018/01/26 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
学生实习推荐信范文
2013/11/26 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
个人评语大全
2014/05/04 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
中学教师教学工作总结
2015/08/13 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python
redis缓存存储Session原理机制
2021/11/20 Redis
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript
vue 给数组添加新对象并赋值
2022/04/20 Vue.js