详解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中使用模块的教程
Apr 27 Python
python中的代码编码格式转换问题
Jun 10 Python
python爬取指定微信公众号文章
Dec 20 Python
pyttsx3实现中文文字转语音的方法
Dec 24 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
python内存管理机制原理详解
Aug 12 Python
python中调试或排错的五种方法示例
Sep 12 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
python反扒机制的5种解决方法
Feb 06 Python
python基于tkinter制作m3u8视频下载工具
Apr 24 Python
Python标准库之typing的用法(类型标注)
Jun 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 中的批处理的实现
2007/06/14 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
jQuery插件开发基础简单介绍
2013/01/07 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
Anaconda下安装mysql-python的包实例
2018/06/11 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
自荐信格式范文
2013/10/07 职场文书
《花的勇气》教后反思
2014/02/12 职场文书
保险公司早会主持词
2014/03/22 职场文书
创业女性典型材料
2014/05/02 职场文书
工会工作先进事迹
2014/08/18 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技