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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
python 统计代码行数简单实例
May 04 Python
Python之os操作方法(详解)
Jun 15 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
python os.path.isfile 的使用误区详解
Nov 29 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
详解Python GUI编程之PyQt5入门到实战
Dec 10 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
第五节 克隆 [5]
2006/10/09 PHP
C# Assembly类访问程序集信息
2009/06/13 PHP
php实现简单文件下载的方法
2015/01/30 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
详解Python中的__new__()方法的使用
2015/04/09 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
python自动化报告的输出用例详解
2018/05/30 Python
Python for循环生成列表的实例
2018/06/15 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
python实现根据文件格式分类
2019/10/31 Python
Pytorch的mean和std调查实例
2020/01/02 Python
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
临床医师专业个人自我评价
2014/01/08 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
初中生期末评语大全
2014/04/24 职场文书
微信搭讪开场白
2015/05/28 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python