Python 中 is 和 == 都是用来比较两个对象的运算符,但是它们的比较内容不同:
- is 是用来比较两个对象的 id 是否相等,也就是比较两个对象是否指向同一块内存地址。
- == 是用来比较两个对象的值是否相等,也就是比较两个对象的内容是否一致。
例如,下面的代码中,a 和 b 都是列表类型,它们的值相等,但是它们的 id 不同,所以 a is b 返回 False,而 a == b 返回 True。
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # False
print(a == b) # True
print(id(a)) # 140506224299464
print(id(b)) # 140506224309576
Python 中有一种小整数对象池的机制,为了提高性能,会缓存一些常用的小整数对象,使得它们的 id 相同。所以,当 a 和 b 都是 [-5, 256] 范围内的整数时,a is b 和 a == b 都返回 True。但是当 a 和 b 超出这个范围时,a is b 就返回 False 了。
a = 100
b = 100
print(a is b) # True
print(a == b) # True
print(id(a)) # 14318944
print(id(b)) # 14318944
a = 1000
b = 1000
print(a is b) # False
print(a == b) # True
print(id(a)) # 140506208811952
print(id(b)) # 140506208812208