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笔记(叁)继续学习
Oct 24 Python
Pyhton中防止SQL注入的方法
Feb 05 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
Python字符串拼接的几种方法整理
Aug 02 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
django项目搭建与Session使用详解
Oct 10 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
python 中的paramiko模块简介及安装过程
Feb 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显示MySQL数据的三种方法
2008/06/05 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
Django实现快速分页的方法实例
2017/10/22 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
大学生实习自我鉴定
2013/12/11 职场文书
外贸英语专业求职信范文
2013/12/25 职场文书
法律进机关实施方案
2014/03/12 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle