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 b
为True
。而-6
由于不在范围内,每次都会新建一个对象,所以是两个对象,a is b
为False
。
同理可以测试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)
结果也印证了这一点。
如果觉得文章有帮助的话,点个赞,是对博主最大的肯定!