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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
python操作CouchDB的方法
Oct 08 Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
python正则表达式的使用
Jun 12 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
200行python代码实现2048游戏
Jul 17 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
让文件路径提取变得更简单的Python Path库
May 27 Python
Python使用BeautifulSoup4修改网页内容
May 20 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实现图象锐化代码
2007/06/14 PHP
php的一个简单加密解密代码
2014/01/14 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
javascript call方法使用说明
2010/01/11 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python文件处理
2016/02/29 Python
Python pymongo模块常用操作分析
2018/09/01 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
椰子猫砂:CatSpot
2018/08/27 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
最新大学职业规划书范文
2013/12/30 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
党员一句话承诺大全
2014/03/28 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
产品生产计划书
2014/05/07 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书