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」。