详解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使用PyFetion来发送短信的例子
Apr 22 Python
Python中if __name__ == "__main__"详细解释
Oct 21 Python
Python实现注册、登录小程序功能
Sep 21 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
pytorch中的自定义数据处理详解
Jan 06 Python
Python post请求实现代码实例
Feb 28 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
使用Python实现音频双通道分离
Dec 25 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 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编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
PHP header函数分析详解
2011/08/06 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
Python中的闭包总结
2014/09/18 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
pytorch permute维度转换方法
2018/12/14 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
教师岗位职责范本
2013/12/29 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
Selenium浏览器自动化如何上传文件
2022/04/06 Python
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers