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使用win32com库播放mp3文件的方法
May 30 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Django卸载之后重新安装的方法
Mar 15 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
python查询文件夹下excel的sheet名代码实例
Apr 02 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
python 将html转换为pdf的几种方法
Dec 29 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
php去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
PHP.vs.JAVA
2016/04/29 PHP
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
Vue指令指令大全
2019/02/09 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
简单解决Python文件中文编码问题
2015/11/22 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
python 异或加密字符串的实例
2018/10/14 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python 里最强的地图绘制神器
2021/03/01 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
大学生关于奋斗的演讲稿
2014/01/09 职场文书
环保建议书作文
2014/03/12 职场文书
青蓝工程实施方案
2014/03/27 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
小学数学教学随笔
2015/08/14 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
Nginx HTTP跳转至HTTPS
2022/05/15 Servers