浅谈python中的“ ==” 与“ is”

在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制。
扯淡的话不多说,下面马上呈上我的第一张图:

                                                                            通过上面代码的比较,我想很容易看得出," is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等。下面敲黑板,如果你自己的实验结果和我的不一致,请不要怀疑我,也不要怀疑自己的编译器,我想你应该遇到了下面的这种情况:

上面这张图和第一张图没有什么区别,只是a 和 b的值由之前的500变成了3,但是结果却和第一张大不相同,我们发现is和==在此时都为true并且a和b的地址完全相同。尼玛,活见鬼了,我们之前的理解是a对应的500和b对应的500应该不在一个内存单元呀!其实这是python解释器搞得鬼,具体是因为python的垃圾回收机制,这个垃圾回收机制会在之后的文章中详细介绍,至于出现上面这种现象是因为一个叫小整数对象池的东西,python为了优化速度,会把【-5,256】之间的数据提前存放在小整数对象池中,程序中只要用的【-5,256】之间的数据不会再重新创建一份,都是指向对象池中的同一份数据,除了这个区间之外的数据,每次使用时系统都会重新申请一块内存,用来存储数据,这样之前的现象也就不奇怪了。 到这里,“ is ”和 “==”之间的恩怨情仇似乎介绍的差不多了,我们接下来再来单独看看“==”。你是否想过python解释器在底层是如何处理“==”的,或者说如何判断两个对象是否相等的呢? 对于数值类型的数据,只要两个数据大小相等,那么就是相等,但是对于非数值型的数据,比如字符串,类创建的对象又是比较什么呢?答案是python默认去比较两个对象的地址,有图有真相:                                                        我们发现上图中,p1和p2两个对象的内容完全相同,但是python编译器却认为其不相等,这个时候就需要我们自己去定义规则去规定在什么条件下两个对象是相等的,具体操作需要去重写python中的__eq__方法,通常把这个过程叫做运算符重载。下面这张图就是完成运算符重载之后的操作,我们发现这时候两个对象的值是相等的。  

对于“==”和 “is”的介绍到此就结束了,希望能帮到之前对此有过困惑的小伙伴,我先撤了哈。

-------------------------

2022年7月17日更新。

几年前写的文章,后面因为个人的一些原因,很惭愧博客没有坚持写下去,偶然回来看评论确实帮助到了很多同学,内心还是有一点高兴,这篇文章说的知识点并不是那些所谓的面试秒杀,高并发等对我们这些大多数日常在公司打螺丝的人来说只有面试时用到的大而虚的东西,但我想当时把这些说明白在今天看来还是有它的意义。我自己几年前也注册过一个公众号,后面没弄下去的原因是自己的知识输入确实无法支撑起持续的输出,渐渐放弃了。最近又重新申请了一个公众号,但是纯打算扯扯蛋,聊聊自己的日常生活、学习理财的体会,关于持续学习以及感兴趣的一些事情,因为纯技术的号我自己也清楚自己搞不动。我自己个人情况大体是:本科:计算机,研究生:人工智能。因为是菜狗,调参实在学不明白,毕业后目前还是在某大厂干开发大头兵,有些刚工作的同学如果需要内推,我很乐意帮忙,毕竟现在确实就业大环境不好。我最近也在思考,如果有一天自己真的被毕业了怎么办?毕竟 heros come and go,but 裁员 forever.  后来想了想一直焦虑也没啥用,保持持续学习,生活上开源节流,认真学习下理财知识,合理安排自己的工资,是自己接下来要做的事情,因为自己真的也没其它能搞钱的特长,大家也不要焦虑,一起加油。公众号名称:苇小院

 

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值