当前位置: 首页 > news >正文

Python中“is”和“==”的区别(避坑)

2.3 “is”和“==”的区别

在Python编写代码时,经常会遇到需要判断2个对象是否相等的情况,这个时候一般就会想到使用is==is==好像都可以用来判断对象是否相等,经常会傻傻分不清,但其实这其中还是有区别的。
不过在这之前,我们得先了解一些基本知识。
①、在Python中,一切皆对象,比如变量、函数等,都是对象。对象包含3个基本要素:

  • id:身份标识
  • type:数据类型
  • value:值
    ②、在Python中,根据对象的值能否原地修改,分为可哈希和不可哈希。能原地修改的是不可哈希对象,不能原地修改的是可哈希对象。Python常见对象(类型)哈希状态如下:
对象(类型)哈希
数字可哈希
字符串可哈希
列表不可哈希
元组可哈希
集合不可哈希
字典不可哈希

③、在Python中,变量的赋值其实就是贴标签,重新赋值后并不会直接修改变量的值,而是将变量重新指向新的赋值对象。关于这一点请看下面的例子:

from icecream import ic
a = 'A'
b = 'B'
ic(a, id(a), id(b))
a = 'B'
ic(a, id(a))

ic| a: ‘A’, id(a): 1897621655920, id(b): 1897659140592
ic| a: ‘B’, id(a): 1897659140592

④、在Python中,可哈希对象的值一样,那么其标识符(id)也一样。请看下方的例子:

from icecream import ic
a = 'ABC'
b = 'ABC'
ic(id(a), id(b))
ic(id(a) == id(b) == id('ABC'))
c = d = 'DEF'
ic(id(c), id(d))
ic(id(c) == id(d) == id('DEF'))
a = b = c
ic(id(a), id(b), id(c))
ic(id(a) == id(b) == id(c))

ic| id(a): 2682794608816, id(b): 2682794608816
ic| id(a) == id(b) == id(‘ABC’): True
ic| id©: 2682822597040, id(d): 2682822597040
ic| id© == id(d) == id(‘DEF’): True
ic| id(a): 2682822597040, id(b): 2682822597040, id©: 2682822597040
ic| id(a) == id(b) == id©: True

在Python中,==是比较操作符,用来比较两个对象的值是否相等。判断时,相当于调用了对象中的__eq__()方法,即:对象1 == 对象2  对象1.eq(对象2)。
is是同一性运算符,用来判断两个对象的标识符(id)是否一致。即:对象1 is 对象2  id(对象1) == id(对象2)。
对于可哈希对象,由于值一样,则标识符(id)必定一样,is==的结果始终保持一致。
而对于不可哈希对象,就算两个对象的值一样,他们的标识符(id)也不一样。导致is==的结果不一样。如下所示:

from icecream import ic
a = ['ABC']
b = ['ABC']
ic(id(a), id(b))
ic(a is b)
ic(id(a) == id(b) == id(['ABC']))
c = d = ['DEF']
ic(id(c), id(d))
ic(c is d)
ic(id(c) == id(d) == id(['DEF']))
a = b = c
ic(id(a), id(b), id(c))
ic(a is b, b is c)
ic(id(a) == id(b) == id(c))

ic| id(a): 1115121876032, id(b): 1115122037184
ic| a is b: False
ic| id(a) == id(b) == id([‘ABC’]): False
ic| id©: 1115122601024, id(d): 1115122601024
ic| c is d: True
ic| id© == id(d) == id([‘DEF’]): False
ic| id(a): 1115122601024, id(b): 1115122601024, id©: 1115122601024
ic| a is b: True, b is c: True
ic| id(a) == id(b) == id©: True

http://www.lryc.cn/news/63320.html

相关文章:

  • 20230426----重返学习-vue-router路由
  • Java字节码指令
  • Vue3之setup参数介绍
  • ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。
  • 试试这几个冷门但好用的软件吧
  • 【云原生】k8s NetworkPolicy 网络策略是怎么样的
  • 手把手教你用几行代码给winform多个控件(数量无上限)赋值
  • 回炉重造十一------ansible批量安装服务
  • 系统集成项目管理工程师 笔记(第20章:知识产权管理、第21章:法律法规和标准规范)
  • Channel-wise Knowledge Distillation for Dense Prediction(ICCV 2021)原理与代码解析
  • No.052<软考>《(高项)备考大全》【冲刺6】《软考之 119个工具 (4)》
  • Go | 一分钟掌握Go | 9 - 通道
  • 【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?
  • BatteryChargingSpecification1.2中文详解
  • 基于Jenkins,docker实现自动化部署(持续交互)【转】
  • 漫谈大数据 - 数据湖认知篇
  • 阿里云国际版ACE与国内版ACE区别
  • Mysql8.0 gis支持
  • 汇编---Nasm
  • NDK OpenGL渲染画面效果
  • 常见的深度学习框架
  • 【设计模式】七大设计原则--------单一职责原则
  • MySQL-中间件mycat(一)
  • ARM寄存器组织
  • 记录一次webdav协议磁盘挂载经验总结
  • 安装Django
  • 【前端面经】JS-如何使用 JavaScript 来判断用户设备类型?
  • 压缩HTML引用字体
  • 大厂高频面试:底层的源码逻辑知多少?
  • 【学习笔记】CF607E Cross Sum