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中的with...as用法介绍
May 28 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
pycharm运行scrapy过程图解
Nov 22 Python
Python JSON编解码方式原理详解
Jan 20 Python
python能自学吗
Jun 18 Python
Python如何输出警告信息
Jul 30 Python
Python如何使用input函数获取输入
Aug 06 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
python 将Excel转Word的示例
Mar 02 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
php session安全问题分析
2011/06/24 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
两款万能的php分页类
2015/11/12 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
Python实现各种排序算法的代码示例总结
2015/12/11 Python
CentOS安装pillow报错的解决方法
2016/01/27 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Python如何将函数值赋给变量
2020/04/28 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
请解释在new与override的区别
2012/10/29 面试题
五一服装活动方案
2014/01/11 职场文书
《白鹅》教学反思
2014/04/13 职场文书