Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理

Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理

Python中,判断不可变对象是否相等与Java十分不同。

结论

Python中判断两个字符串相等:既可以使用"==",又可以使用"is"
判断整数,浮点数以及Tuple时,最好使用"=="
这个问题可以进一步引申至Python的底层实现原理上。

原理

整数

Python在底层实现中,一切都是对象。包括整数等也是对象。这些基本的不可变对象在python里会被频繁的引用,创建,如果不能重用的话,极易导致效率瓶颈,所以python引入了整数对象池的机制。
Python中,对于[-5,256]的整数,创建了整数对象池,创建范围内的小整数会自动引用对象池中的整数对象。

a = -5
b = -5
print(a is b)
print(a == b)
a1 = -6
b1 = -6
print(a1 is b1)
print(a1 == b1)

整数

从运行结果图上可以看出,-5由于是小整数,引用整数池中的对象,所以是同一个对象,a is bTrue。而-6由于不在范围内,每次都会新建一个对象,所以是两个对象,a is bFalse
同理可以测试256,257。前者为True,后者为False

浮点数

由于浮点数有无穷多个,所以浮点数并没有常量池。在创建浮点数对象时会直接新建一个对象。

a = 0.0
b = 0.0
print(a is b)
print(a == b)

浮点数

从结果中可见,两者值相等,但并不是指向同一内存地址。

字符串

a = 'abc'
b = 'abc'
print(a is b)
print(a == b)

字符串

Python中存在着intern机制。由于字符串是不可变对象,它对字符串维护着一个字典,每次新建一个字符串变量时,会先查询字典中是否已经有该字符串值。如果有,直接引用。如果没有再新建。这个机制决定了字符串值相等,则一定指向相同的对象。

Tuple

对于元组,虽然其是不可变对象,但在底层实现无intern机制,就是单纯的一个可以迭代的数组,存放着元素。每次创建都会开辟地址。所以新建两个值相同的变量会创建两个对象。使用"=="判断。

a = (1,2,3)
b = (1,2,3)
print(a == b)
print(a is b)

在这里插入图片描述

结果也印证了这一点。


如果觉得文章有帮助的话,点个赞,是对博主最大的肯定!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值