Python中运算符"=="和"is"的详解


Posted in Python onOctober 08, 2016

前言

在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。

Python中比较两个对象是否相等,一共有两种方法,简单来说,它们的区别如下:

     is是比较两个引用是否指向了同一个对象(引用比较)。

     ==是比较两个对象是否相等。

>>> a = [1, 2, 3]
>>> b = a
>>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象
True 
>>> b == a # 当然,他们的值也是相等的
True
>>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象,
>>> b is a # 所以指向的不是同一个对象了
False
>>> b == a # 但他们的值还是相等的
True

实现原理

is比较的是两者是否是同一个对象,所以比较的是内存地址(id是否相同)。

==是值比较。不可变对象,例如int,str,它会直接进行值比较。对于Python已知的对象,会调用他们的__eq__函数来比较。(其实已知的对象应该也是通过内置的__eq__函数来比较的)。对于自定义的对象,如果实现了__eq__函数,就会使用它比较,如果没有实现,效果和==是一样的。

对象缓存机制

Python会对比较小的对象缓存,下次用到比较小的对象时,会去缓存区查找,如果找到,不会再开辟新的内存,而是继续把小对象的地址赋给新的值。例子:

>>> c = 1
>>> d = 1
>>> print(c is d) 
True
 
>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

通过计算得到的赋值,不会使用缓存区。从第一个代码示例中可以看出。

对于字符串,你可以通过使用intern函数强制使用缓存区。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python查找第k小元素代码分享
Dec 18 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
python如何通过pyqt5实现进度条
Jan 20 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
Python答题卡识别并给出分数的实现代码
Jun 22 Python
Python 爬虫多线程详解及实例代码
Oct 08 #Python
python字符串,数值计算
Oct 05 #Python
python制作企业邮箱的爆破脚本
Oct 05 #Python
python爬取NUS-WIDE数据库图片
Oct 05 #Python
python2.7的编码问题与解决方法
Oct 04 #Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 #Python
Python实现屏幕截图的代码及函数详解
Oct 01 #Python
You might like
E路文章系统PHP
2006/12/11 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
python登录QQ邮箱发信的实现代码
2013/02/10 Python
遗传算法之Python实现代码
2017/10/10 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
python requests.get带header
2020/05/05 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
python切割图片的示例
2020/11/12 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
高中生校园生活自我评价
2013/09/19 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
欢迎标语大全
2014/06/21 职场文书
干部对照检查材料范文
2014/08/26 职场文书
2014年科室工作总结
2014/11/20 职场文书
出国留学导师推荐信
2015/03/26 职场文书
被委托人身份证明
2015/08/07 职场文书
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL