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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
python 与服务器的共享文件夹交互方法
Dec 27 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
python实现的爬取电影下载链接功能示例
Aug 26 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
python关于变量名的基础知识点
Mar 03 Python
django中嵌套的try-except实例
May 21 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
通过代码实例了解Python异常本质
Sep 16 Python
Python利用FlashText算法实现替换字符串
Mar 31 Python
如何使用python包中的sched事件调度器
Apr 30 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
深入理解python函数递归和生成器
2016/06/06 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
python基础练习之几个简单的游戏
2017/11/10 Python
将python代码和注释分离的方法
2018/04/21 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python 读取数据库并绘图的实例
2019/12/03 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
总监职责范文
2013/11/09 职场文书
体育专业个人求职信范文
2013/12/27 职场文书
文案策划求职信
2014/03/18 职场文书
同意离婚答辩状
2015/05/22 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android