详解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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
使用Python编写类UNIX系统的命令行工具的教程
Apr 15 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
玩转python爬虫之cookie使用方法
Feb 17 Python
用python实现百度翻译的示例代码
Mar 09 Python
python实现log日志的示例代码
Apr 28 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
python scp 批量同步文件的实现方法
Jan 03 Python
Python 元组操作总结
Sep 18 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
浅谈python3 构造函数和析构函数
Mar 12 Python
python+requests实现接口测试的完整步骤
Oct 27 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验证码 附调用方法
2016/06/02 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
JavaScript 字符串连接性能优化
2008/12/20 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python2.7实现FTP文件下载功能
2018/04/15 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
Python 硬币兑换问题
2019/07/29 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
超级实用的8个Python列表技巧
2020/08/24 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
探矿工程师自荐信
2014/01/24 职场文书
学习雷锋活动总结
2014/04/29 职场文书
英语系毕业生求职信
2014/07/13 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB