详解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实现进程间通信简单实例
Jul 23 Python
在Python操作时间和日期之asctime()方法的使用
May 22 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
对Python 语音识别框架详解
Dec 24 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
Python调用jar包方法实现过程解析
Aug 11 Python
Python可视化工具如何实现动态图表
Oct 23 Python
python绘图subplots函数使用模板的示例代码
Apr 30 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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比较多维数组中值的大小排序实现代码
2012/09/08 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
分析JS中this引发的bug
2017/12/12 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
详解Python中dict与set的使用
2015/08/10 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
医大实习自我鉴定
2013/12/07 职场文书
委托协议书范本
2014/04/22 职场文书
产品开发计划书
2014/04/27 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
党员违纪检讨书
2015/05/05 职场文书
SQLServer常见数学函数梳理总结
2022/08/05 MySQL