Python面试题系列之01 is 与 == 的区别

Python面试题系列之01: is 与 == 的区别

Question

请简述下is==的区别?

知识点详解

我们先从下面这三个例子入手

a = "Pythonista"
b = "Pythonista"
print(a is b,a == b)

输出的布尔值依次为TrueTrue

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

输出的布尔值依次为FalseTrue

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

输出的布尔值依次为TrueTrue

上面的输出结果中为什么有的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的话,即ab指向同一块内存地址的话,a == b也返回True,即ab的值也相等。

了解这些概念后,再来回顾下上面的三组例子:

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)后就很清楚了。只要ab的值相等,a == b就会返回True,而只有id(a)id(b)相等时,a is b才返回True

总结一下,is是检查两个对象是否指向同一块内存空间,而==是检查他们的值是否相等。可以看出,is是比==更严格的检查,is返回True表明这两个对象指向同一块内存,值也一定相同。

Answer

is是对比地址,而==是对比值

后记

搞懂了is==的区别,那我们来思考一下下面这个问题:
Python中与None比较时,为什么是is None而不是== None呢?
欢迎大家在评论区留言说出自己的看法。好了,以上就是本篇全部内容。

备注:本篇首发于知识星球「人人都是Pythonista」。


文章作者: &娴敲棋子&
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 &娴敲棋子& !
评论
  目录