在Python中一切都是对象。

Python中对象包含的三个基本要素,分别是:

  • id(身份标识)
  • type(数据类型)
  • value(值)

对象之间比较是否相等可以用 == ,也可以用 is 。

is 和 == 都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪?

is 比较的是两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址。

== 比较的是两个对象的内容是否相等,默认会调用对象的 __eq__方法。

== 是python标准操作符中的比较操作符,用来比较判断两个对象的值是否相等。

先来看一个例子

>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

is 也被叫做同一性运算符,也就是id是否相同。

看下面代码, a和b变量的id不同, 所以 b == a 是True, b is a 是False.

再来看一下他们的id:

>>> id(a)
4364243328
>>>
>>> id(b)
4364202696

哪些情况下 is 和 == 结果是完全相同的?

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>> a = 1000
>>> b = 10**3
>>> a == b
True
>>> a is b
False
>>>

所以数字类型不完全相同。

那为什么256时相同, 而1000时不同呢?

因为出于对性能的考虑,Python内部做了很多的优化工作,对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫 small_ints 的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。

Python把这些可能频繁使用的整数对象规定在范围 [-5, 256] 之间的小对象放在 small_ints 中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。

>>> c = 'miracle.young'
>>> d = 'miracle.young'
>>> c is d
False
>>> c == d
True
>>> c = 'miracleyoung'
>>> d = 'miracleyoung'
>>> c is c
True
>>> c == d
True

所以字符串类型不完全相同,这个和解释器实现有关。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = (1,2,3) # a和b为元组类型
>>> b = (1,2,3)
>>> a is b
False
>>> a = [1,2,3] # a和b为list类型
>>> b = [1,2,3]
>>> a is b
False
>>> a = {'miracle':100,'young':1} # a和b为dict类型
>>> b = {'miracle':100,'young':1}
>>> a is b
False
>>> a = set([1,2,3]) # a和b为set类型
>>> b = set([1,2,3])
>>> a is b
False

所以当变量是数字、字符串、元组,列表,字典时,is 和==都不相同, 不能互换使用!当比较值时,要使用==,比较是否是同一个内存地址时应该使用is。
当然,开发中比较值的情况比较多。

Python的 is 和 == 弄懂了吗?相关推荐

  1. 【Python】一文弄懂python装饰器(附源码例子)

    目录 前言 一.什么是装饰器 二.为什么要用装饰器 三.简单的装饰器 四.装饰器的语法糖@ 五.装饰器传参 六.带参数的装饰器 七.类装饰器 八.带参数的类装饰器 九.装饰器的顺序 总结 写在后面 前 ...

  2. if __name__ == __main___一文带你弄懂python中if __name__ == #39;__main__#39;

    我们在python模块那章节的学习,有所接触到if __name__ == '__main__'这个概念.当时我们只是大概描述了一番,不少伙伴还是有所困惑,今天就让我们通过实际例子去讲解这条语句到底有 ...

  3. python——实例详细弄懂if __name__ == ‘__main__‘用法

    前言:在python慢慢学习路中,经常会遇到if __name__ == "__main__",而且会发现不写这句话,代码依旧可以执行.心里就有一百个疑问,通过大神指导,小编终于理 ...

  4. 彻底弄懂Python标准库源码(一)—— os模块

    目录 第1~22行 模块整体注释.nt与posix 第24~46行 模块引入._exists方法._get_exports_list方法 第48~97行 根据系统不同导入不同的方法和属性 第100~1 ...

  5. 彻底弄懂Python标准库源码(三)—— pprint模块

    目录 模块整体注释 依赖模块导入.对外暴露接口 saferepr函数--返回对象的字符串表示,并为无限递归数据结构提供保护 isreadable函数--返回对象的是否"可读" is ...

  6. 彻底弄懂Python中的GIL锁

    彻底弄懂Python中的GIL锁 转载:https://blog.csdn.net/yushuaigee/article/details/86537474 刚学习python时,我关注了许多介绍pyt ...

  7. 【python实例6.5】一篇文章让你弄懂政府工作报告词云~总结笔记

    一篇文章让你弄懂政府工作报告词云 1.安装wordcloud库 2.新时代中国特色社会主义的词云 wordcloud下载链接: https://www.lfd.uci.edu/~gohlke/pyth ...

  8. 一文弄懂神经网络中的反向传播法

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  9. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...

最新文章

  1. Disruptor源码解析 + 实战
  2. python文件处理:每隔一定数目删除;文件重命名;删除多余xml文件;将文件夹线所有文件平均分配到其他文件夹
  3. React Native 实现FlatList的下拉刷新上拉加载
  4. 第一章python绝对温标身体质量指数bmi
  5. js带开关的时钟_避雷器带计数器HY5WZ-17/45-JS
  6. matlab 求解 Ax=B 时所用算法
  7. 1.2、使用pip安装Python包
  8. Fluent批处理及.jou和.scm文件编写的相关操作
  9. “大圆满”之前行--从概念到知识再到计算的共生【原力】_目录规划与提要
  10. Vscode新建文件输入感叹号不能生成头文件
  11. 世界上最大的计算机硬盘,全球最大机械硬盘:8碟12TB、充氦封装
  12. DyingGasp电路(掉电检测电路)设计
  13. 工业物联网·能耗监控智慧空调接入华为云解决方案
  14. 咸鱼Micropython— network
  15. MySQL5.7官方下载链接导航
  16. 爬取QQ音乐周杰伦前五页歌曲的歌词
  17. vue前端实现从数据库获取数据的下拉框以及带参请求
  18. 25.java中IO流的应用---缓冲流、转换流以及对象流过程(附讲解和练习)
  19. 第51次全国计算机等级考试,第51次全国计算机等级考试(NCRE)在我校顺利举行...
  20. 段错误(Segmentation fault)

热门文章

  1. NA-NP-IE系列实验18:ip default-network
  2. 【BZOJ2662】【BeiJing wc2012】冻结 分层图 裸的!
  3. 2015级C++第10、11周程序阅读 继承和派生
  4. HTML DOM(一):认识DOM
  5. salt的远程部署java-1.6.0-openjdk
  6. 【收藏】生产订单业务流程
  7. 合并财务报表无条件抵销分录
  8. 释疑の手工凭证界面不显示页数
  9. 1、Power View—使用前的准备
  10. 如何查看CO凭证号码及明细