python中的==和is

这里是我找了相关的资料来解释了==和is的区别
直接看例子吧
这里写图片描述

这里写图片描述

从这两个小例子可以看到,变量赋值和=号赋值是不一样的,变量赋值是改变了变量的指向,而等号赋值是重新开辟了一块内存,所以第二个例子中a和b的地址不同,对于is和==,is用来判断内存地址是否相同即为是否为同一个对象,而==是判断值是否相等,接着再看下面的例子

这里写图片描述
奇怪了,刚刚=赋值时说明是新开辟了一块内存,这里的例子怎么内存地址是一样的??先不急,继续往下看
这里写图片描述

这就更奇怪了!地址又变得相同了,难道这是随机分配的吗??当然不是,这个例子和上面的例子唯一的不同是a和b赋值的大小不同,一个为1,一个为500,这里就要引出一个小整数池的东西,python为了优化速度,会把【-5,256】之间的数据提前存放在小整数对象池中,程序中只要使用的【-5,256】之间的数据就不会再重新创建一份,都是指向对象池中的同一份数据,除了这个区间之外的数据,每次使用时系统都会重新申请一块内存,用来存储数据,这样就解释的通了!
除了小整数池还有一个intern的机制,都是为了节约内存的,请看string对象的intern机制https://blog.csdn.net/f1ngf1ngy1ng/article/details/80484376

我们继续看==和is,上面已经说过了,is用来判断内存地址是否相同即为是否为同一个对象,而==是判断值是否相等,又出来一个问题,对于数值类型的数据,只要两个数据大小相等,那么就是相等,但是对于非数值型的数据,比如字符串,类创建的对象又是比较的,比较什么呢?这就要看下==在python解释器的底层是如何运行的了,还是看例子
这里写图片描述
所以对于非数值型的数据,python默认去比较两个对象的地址,==在底层调用的是__eq__方法,可以重写这个方法,有兴趣可以找找源码看看

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值