Python中 ‘==‘ 与‘is‘的区别

嗨喽,大家好呀~这里是爱看美女的茜茜呐

比较判断逻辑是在代码中经常使用的,在Python中常用 ‘==’ 和 is 来做比较判断。

== : 双等号是用来比较变量所指向内存单元中的值是否相等,它只关心值,并不在意值的内存地址,也就是说可以是两个不同内存地址的值相等。

is : 它用来比较两个变量是不是指向同一个内存单元,虽然它也可以比较值,但是它更加关心的是内存地址是否一样,当然内存地址一样值也就是一样的。


👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~

python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可


关于整数

# 按照逻辑,下面的代码很正常
>>> a = 1
>>> b = 1
>>> a == b
True
>>> a is b
True
>>> id(a)
1570522768
>>> id(b)
1570522768
# 下面就是颠覆认知的时刻
>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> a is b
False
>>> id(a)
81183344
>>> id(b)
81183376

是的,两个相同值的变量,内存地址不一样了。

当然产生这个现象的前提条件是用python命令行去执行,而不是用pycharm之类的编辑器。

其根本原因也就是python解释器的问题,涉及到python的垃圾回收机制。

上面现象的原因是因为一个叫做小整数对象池的东西。

Python为了优化速度,会把 [-5, 256] 之间的数据提前存放在小整数池中,如果程序使用到小整数池中的数据,是不会开辟新的内存空间去创建,而是指向对象池中的同一份数据,也就是说有N个变量等于1的话,那么这N个变量的内存地址都会指向小整数池中的1位置。

小整数池的使用是为了避免整数频繁申请和销毁内存空间。

小整数池是提前建立好的,不会被垃圾回收。

当数据超出小整数池后,也就是范围到了大整数对象池中了,系统每次都会申请一块新内存来存储数据,这个’is’不等于’=='的现象也就不存在了。

pycharm中,每次运行是所有代码都加载到内存中,属于一个整体,并不存在这个现象。

关于字符串

'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6  笔芯~)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
# 先来个正常的
>>> a = 'qwe'
>>> b = 'qwe'
>>> a == b
True
>>> a is b
True
>>> id(a)
81797024
>>> id(b)
81797024
#  感觉没什么变化,那就加长一些
>>> a = 'q' * 20
>>> b = 'q' * 20
>>> a is b
True
>>> a == b
True
# 在长点就不一样了
>>> b = 'q' * 21
>>> a = 'q' * 21
>>> a is b
False
>>> a == b
True
>>> id(a)
81811696
>>> id(b)
81811600
产生原因:Python的intern机制。

简单理解有点像缓存的意思,当需要使用相同的字符串时(变量赋值),直接从缓存中拿出来用而不是重新创建,这样可以避免频繁的创建和销毁,提升效率,节约内存。

缺点是拼接字符串,对字符串修改之类的影响性能。

因为是不可变的,所以对字符串修改不是inplace操作,而是新建对象。

这也就是拼接字符串的时候不建议是用 ‘+’ 方法,而是推荐用join 函数,join函数是先计算出所有字符串的长度,然后一一拷贝,而只创建一次对象。

每个’+'方法都是创建一次新对象。当字符串长度超过20时,也不会使用intern机制。

并不是所有的字符串都会采用intern机制。

  • 只包含下划线,字母(包含大小写),数字的字符串才会被intern。

  • 空格和一些特殊字符都不在内。

也就是说字符串中如果包含空格和其他一些特殊符号(除去下划线),python都不会应用intern机制,而是直接开辟新的内存空间去存储。

'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6  笔芯~)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
# 注意下面这种看似合理的字符串intern
>>> 'ab' + 'c' is 'abc'         #  这里的字符串,'ab' + 'c' 是在complie time 求值的,被替换成了'abc'
True
>>> n1 = 'ab'
>>> n2 = 'abc'
>>> n1 + 'c' is n2               # n1 + 'c'  是在run-time拼接,导致没有被自动intern
False
>>> n1 + 'c' is 'abc'
False
>>> n1 + 'c' == 'abc'
True
>>> n1 + 'c' == n2
True

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/474932.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剖析中青年专家英年早逝现象

剖析中青年专家英年早逝现象 近年来,一个令人痛心的现象频繁触动公众的心弦——不少处于事业巅峰期的中青年专家、教授不幸英年早逝。他们的去世不仅是个人和家庭的悲剧,也是国家和社会的巨大损失。这一现象背后的原因错综复杂,涉及工作压力、…

《辽宁春晚》开场动画惊艳亮相,蓝海创意云渲染服务再显神通

随着2024年甲辰龙年的脚步日益临近,备受瞩目的《辽宁春晚》于除夕夜为全国观众带来了一场精彩绝伦的视听盛宴。作为整场晚会的亮点之一,开场动画以其独特的创意和精美的画面效果,为观众带来了一个难忘的视觉体验。而这一精彩的呈现&#xff0…

无人机技术,无人机动力系统知识,电机、电调、桨叶技术详解

无人机动力系统中的电机、电调和桨叶技术都是非常重要的部分,以下是对这些技术的详解: 无人机电机 在无人机动力系统中,电机是将电能转化为机械能的关键部件。其主要作用是产生旋转力矩,驱动螺旋桨的旋转,从而实现无…

UnityShader——07数学知识:向量

数学知识:向量 二维(笛卡尔)坐标系 二维向量(矢量) 具有方向的线段叫做有向线段,以A为起点、B为终点的有向线段作为向量,可以记作 v B - A。区别于有向线段,在一般的数学研究中&a…

Shell脚本条件语句

1.条件测试 文件测试与整数测试 test命令 测试表达式是否成立,若成立返回0,不成立返回其他数值 格式1:test 条件表达式 格式2:[ 条件表达式 ] 测试 是否成功使用 $? 操作符: -d:测试是否为目…

【Java程序员面试专栏 Java领域】Java虚拟机 核心面试指引

关于Java 虚拟机部分的核心知识进行一网打尽,主要包括Java虚拟机的内存分区,执行流程等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 JVM 程序执行流程 包括Java程序的完整执行流程,以及Javac编译,JIT即时编译 Java程序的完整执…

九宫格锁屏模块,九宫格设置密码

要使用九宫格设置密码,先用自定义一个九宫格样式,使用的自定义的view画出九个点,然后重写onMeasure和onDraw,这两个方法,并处理onTouchEvent,这个事件 在Android视图的绘制和布局过程中,onMeasure和onDraw这两个方法的调用顺序是固定的。以下是它们通常的调用顺序&…

成都力寰璨泓科技有限公司抖音小店购物新体验

在数字化时代,网购已成为人们生活中不可或缺的一部分。随着抖音等短视频平台的兴起,越来越多的消费者选择在抖音小店购物。成都力寰璨泓科技有限公司抖音小店,作为新兴的电商力量,凭借其可靠的品质和服务,正逐渐成为消…

去测试化真的可行吗?

当前业界对于软件测试和质量相关的讨论非常广泛,各种不同的声音此起彼伏。其中包括质疑测试人员的必要性、去测试人员化、强调测试技术化和工程化、探讨测试与质量的协同作用、讨论敏捷测试、持续测试以及全程自动化测试等等。 这些讨论表明,测试工作和…

23年秋招结束,同学们陆陆续续拿到心仪的offer!24年秋招出发!

续接上次上岸同学的分享:还在担心秋招吗?看看24届已上岸同学的经验分享! 秋招的时间过程相同,但经历却各不相同。学历、专业似乎都影响着同学们的面试经历和感受。校招的面试毫无疑问学历的加持是巨大的优势,学历好会…

秒懂百科,C++如此简单丨第二十一天:栈和队列

目录 前言 Everyday English 栈(Stack) 图文解释 实现添加删除元素 实现查看清空栈 完整代码 运行示例 栈的选择题 队列(Queue) 图文解释 队列的基本用法 完整代码 运行结果 队列的好处 结尾 前言 今天我们将…

六、Spring/Spring Boot整合ActiveMQ

Spring/Spring Boot整合ActiveMQ 一、Spring整合ActiveMQ1.pom.xml2.Queue - 队列2.1 applicationContext.xml2.2 生产者2.3 消费者 3.Topic - 主题3.1 applicationContext.xml3.2 生产者3.3 消费者 4.消费者 - 监听器4.1 编写监听器类4.2 配置监听器4.3 生产者消费者一体 二、…