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 ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 Python
举例讲解Python中装饰器的用法
Apr 27 Python
Python实现方便使用的级联进度信息实例
May 05 Python
Python使用gensim计算文档相似性
Apr 10 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 Python
python获取array中指定元素的示例
Nov 26 Python
Django模板获取field的verbose_name实例
May 19 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 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
B2K与车机的中波PK
2021/03/02 无线电
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
python文件写入实例分析
2015/04/08 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
几道PHP的面试题
2012/05/19 面试题
药剂学专业应届生自荐信
2013/09/29 职场文书
员工薪酬福利制度
2014/01/17 职场文书
乡镇党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
无房证明样本
2015/06/17 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang