is 和 == ,我们来看一下这两者的区别。

我们先来看几个例子:

a = "hello"
b = "hello"
print(a is b)  # 输出 True
print(a == b)  # 输出 Truea = "hello world"
b = "hello world"
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = a
print(a is b)  # 输出 True
print(a == b)  # 输出 True

  

上面的输出结果中为什么有的 is 和 == 的结果相同,有的不相同呢?我们来看下官方文档中对于 is 和 == 的解释。官方文档中说 is 表示的是对象标示符(object identity),而 == 表示的是相等(equality)。is 的作用是用来检查对象的标示符是否一致,也就是比较两个对象在内存中的地址是否一样,而 == 是用来检查两个对象是否相等。我们在检查 a is b 的时候,其实相当于检查 id(a) == id(b)。而检查 a == b 的时候,实际是调用了对象 a 的 __eq()__ 方法,a == b 相当于 a.__eq__(b)。一般情况下,如果 a is b 返回True的话,即 a 和 b 指向同一块内存地址的话,a == b 也返回True,即 a 和 b 的值也相等。好了,看明白上面的解释后,我们来看下前面的几个例子

a = "hello"
b = "hello"
print(id(a))   # 输出 140506224367496
print(id(b))   # 输出 140506224367496
print(a is b)  # 输出 True
print(a == b)  # 输出 Truea = "hello world"
b = "hello world"
print(id(a))   # 输出 140506208811952
print(id(b))   # 输出 140506208812208
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))   # 输出 140506224299464
print(id(b))   # 输出 140506224309576
print(a is b)  # 输出 False
print(a == b)  # 输出 True a = [1, 2, 3]
b = a
print(id(a))   # 输出 140506224305672
print(id(b))   # 输出 140506224305672
print(a is b)  # 输出 True
print(a == b)  # 输出 True

  

打印出 id(a) 和 id(b) 后就很清楚了。只要 a 和 b 的值相等,a == b 就会返回True,而只有 id(a) 和 id(b) 相等时,a is b 才返回 True。

这里还有一个问题,为什么 a 和 b 都是 "hello" 的时候,a is b 返回True,而 a 和 b都是 "hello world" 的时候,a is b 返回False呢?

这是因为前一种情况下Python的字符串驻留机制起了作用,当字符串中出现了非标识符允许的字符的时候才不采取驻留,如果你把"hello world"改成"hello_world", a is b还是返回 true,只是因为字符中有一个空格所以才不采用驻留,为了提高系统性能Python会保留其值的一个副本,当创建新的字符串的时候直接指向该副本即可。所以 "hello" 在内存中只有一个副本,a 和 b 的 id 值相同,而 "hello world" 有空格,为非标识符允许的字符,不驻留内存,Python中各自创建了对象来表示 a 和 b,所以他们的值相同但 id 值不同。

总结一下,is 是检查两个对象是否指向同一块内存空间,而 == 是检查他们的值是否相等。可以看出,is 是比 == 更严格的检查,is 返回True表明这两个对象指向同一块内存,值也一定相同

转载于:https://www.cnblogs.com/Sandy-1128/p/python-sandy-0402.html

is 和 ==的区别相关推荐

  1. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  2. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  3. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  4. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  5. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  6. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  7. python二进制打开(rb)和文本格式打开(r)什么区别?

    使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...

  8. python中__dict__与dir()区别

    前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...

  9. java和C#面向对象的区别

    问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...

  10. 判别模型和生成模型的区别

    20210703 https://www.zhihu.com/question/20446337 机器学习"判定模型"和"生成模型"有什么区别? 重点 http ...

最新文章

  1. Javascript - prototype、__proto__、constructor
  2. [转载] 七龙珠第一部——第031话 假悟空出现
  3. MySQL:Database connections will be migrated官方说明
  4. (微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆)http://blog.csdn.net/liaohaojian/article/details/70175835
  5. 03 Android应用界面编程
  6. 左击鼠标出现右击选项是怎么回事_跟着诗妍姐姐学电脑——鼠标
  7. Element Select多选选中项溢出选项框
  8. vue 动态设置背景图片
  9. echart关系树状图_干货 | 25个常用Matplotlib图的Python代码
  10. javascript学习代码
  11. windows环境下,如何在Pycharm下安装TensorFlow环境
  12. 找到replication相关的作业和sql 语句
  13. 20 个百无一用的 Firefox 扩展
  14. OpenGL基础53:阴影映射(下)
  15. gogs 把用户加入项目
  16. CSND Markdown语法学习笔记
  17. 软件测试工具Winrunner TSL命令简介
  18. 将强化学习应用到量化投资中实战篇(学习模块开发上)
  19. 欧姆龙plc学习笔记(八)(上传nb程序)
  20. SEO项目管理,该问自己的几个问题?

热门文章

  1. Spring(五):SpringStruts2Hibernate整合后,实现查询Employee信息
  2. 仅支持chrome的滚动条样式
  3. Verilog代码规范I
  4. Web开发者推荐的最佳HTML5/CSS3代码生成器
  5. Json在Java后台的操作
  6. C陷阱与缺陷的学习笔记
  7. 孩子听不进道理怎么办?
  8. Localhost与数据库连接
  9. 让Hive支持行级insert、update、delete
  10. 90. Subsets II