轻松理解python中的“ ==” 与“ is

轻松理解python中的“ ==” 与“ is

在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,希望能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制。
在这里插入图片描述
通过上面代码的比较,我想很容易看得出," is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等。下面敲黑板,如果你自己的实验结果和我的不一致,请不要怀疑我,也不要怀疑自己的编译器,我想你应该遇到了下面的这种情况:
在这里插入图片描述

上面这张图和第一张图没有什么区别,只是a 和 b的值由之前的666变成了1,但是结果却和第一张大不相同,我们发现is和==在此时都为true并且a和b的地址完全相同。我们之前的理解是a对应的666和b对应的666应该不是一个内存地址呀!其实这是python解释器搞得鬼,具体是因为python的垃圾回收机制,这个垃圾回收机制会在之后的文章中详细介绍,至于出现上面这种现象是因为一个叫小整数对象池的东西,python为了优化速度,会把【-5,256】之间的数据提前存放在小整数对象池中,程序中只要用的【-5,256】之间的数据不会再重新创建一份,都是指向对象池中的同一份数据,除了这个区间之外的数据,每次使用时系统都会重新申请一块内存,用来存储数据,这样之前的现象也就不奇怪了。
对于数值类型的数据,只要两个数据大小相等,那么就是相等,但是对于非数值型的数据,比如字符串,类创建的对象又是比较什么呢?答案是python默认去比较两个对象的地址,如下图

在这里插入图片描述

我们发现上图中,p1和p2两个对象的内容完全相同,但是python编译器却认为其不相等,这个时候就需要我们自己去定义规则去规定在什么条件下两个对象是相等的,具体操作需要去重写python中的__eq__方法,通常把这个过程叫做运算符重载。下面这张图就是完成运算符重载之后的操作,我们发现这时候两个对象的值是相等的。

在这里插入图片描述

对于 is 和 == 就介绍到这里了,希望对兄弟们有所帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值