Python面试题系列之01: is 与 == 的区别
Question
请简述下is与==的区别?
知识点详解
我们先从下面这三个例子入手
a = "Pythonista"
b = "Pythonista"
print(a is b,a == b)
输出的布尔值依次为True、True
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b,a == b)
输出的布尔值依次为False、True
a = [1, 2, 3]
b = a
print(a is b,a == b)
输出的布尔值依次为True、True
上面的输出结果中为什么有的is和==的结果相同,有的不相同呢?
我们来看下官方文档中对于is和==的解释。
is表达的是对象标识符,object identity,它的作用是用来检查对象的标识符是否一致,也就是比较两个对象在内存中的地址是否一样。
== 表达的是相等,equality,则是用来检查两个对象是否相等。
我们在执行a is b的时候,其实相当于检查id(a) == id(b)。
而执行a == b的时候,实际是调用了对象 a 的__eq()__方法,即a == b相当于 a.__eq__(b)。
一般情况下,如果a is b返回True的话,即a和b指向同一块内存地址的话,a == b也返回True,即a和b的值也相等。
了解这些概念后,再来回顾下上面的三组例子:
a = "Pythonista"
b = "Pythonista"
print(id(a)) # 输出 2788006878712
print(id(b)) # 输出 2788006878712
print(a is b) # 输出 True
print(a == b) # 输出 True
a = [1, 2, 3]
b = [1, 2, 3]
print(id(a)) # 输出 2787978142344
print(id(b)) # 输出 2787978142408
print(a is b) # 输出 False
print(a == b) # 输出 True
a = [1, 2, 3]
b = a
print(id(a)) # 输出 2788006947720
print(id(b)) # 输出 2788006947720
print(a is b) # 输出 True
print(a == b) # 输出 True
打印出id(a)和id(b)后就很清楚了。只要a和b的值相等,a == b就会返回True,而只有id(a)和id(b)相等时,a is b才返回True。
总结一下,is是检查两个对象是否指向同一块内存空间,而==是检查他们的值是否相等。可以看出,is是比==更严格的检查,is返回True表明这两个对象指向同一块内存,值也一定相同。
Answer
is是对比地址,而==是对比值
后记
搞懂了is与==的区别,那我们来思考一下下面这个问题:
Python中与None比较时,为什么是is None而不是== None呢?
欢迎大家在评论区留言说出自己的看法。好了,以上就是本篇全部内容。
备注:本篇首发于知识星球「人人都是Pythonista」。