在 Python 中,比较两个对象(变量)是否相等,能够用 “is” 和 “==” 操做,但它俩有什么区别?何时用 “is”,何时用 “==” ?在面试时,发现很多候选人很难把这二者彻底说清楚,所以在这篇文章中,「Python之禅」将对两者进行深刻浅出的对比介绍。html
先举个例子python
小黄最近手头很是宽裕,花重金购买了一辆 P90D 特斯拉,咱们暂且给这车取名叫 "小P" ,这辆车和隔壁老王家的车(车名叫 "小 王")是如出一辙的,不管是型号、外表仍是价格都同样,是同批次生产的。这里咱们能够说 "小P" 和"小王"是两辆如出一辙的、相等的(euqal),但本质上这是两个不一样的对象。有一天小君给他的爱车又取了一个网名叫 "爱驹",当咱们说 "小P" 的时候其实就是在讨论 "爱驹",由于本质上两个名字指的是同一个对象,这里咱们把 "小P" 和 "爱驹" 称为彻底相等的(identical)。面试
在 Python 中,”==” 和 “is” 的区别可类比这个例子 ,前者是相等性比较,比较的是两个对象中的值是否相等,后者是一致性比较,比较的是两个对象的内存空间地址是否相同。ide
显然,若是内存地址相同,那么他们的值确定也是同样的,所以,若是 “is” 返回 True,那么 “==” 必定也返回 True,反之却不成立。spa
talk is cheap, show me the code.net
先建立一个列表对象,而后给它指定一个名字 a,再定义另一个变量 b,让它指向同一个对象。code
>>> a = [1, 2, 3]
>>> b = a复制代码
a 和 b 打印的值都是相等的,由于这两个变量指向的是同一个对象,就比如给一辆车起了两个不一样的名字。cdn
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]复制代码
理所固然, is 和 == 都返回 True。htm
>>> a == b
True
>>> a is b
True复制代码
建立一个新的对象,尽管值是同样的,可是他们本质上是两个不一样的对象,处在两个不一样的内存空间,所以 "is" 返回的是 False。对象
>>> c = [1,2,3]
>>> a is c
False复制代码
有且当仅比较的两个变量指向同一个对象时 "is" 才返回 True,而 "==" 最终取决于对象的 __eq__() 方法,本质上两个变量进行 "==" 比较操做调用的是对象的 __eq__() 方法。例如:
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == 1
True
>>> f == None
True
>>> f is None
False复制代码
由于自定义类 Foo 的 eq 方法恒返回 True,所以它与任何对象进行 "==" 都是返回 True。而它与 None 是两个不一样的对象,所以 'is' 操做返回的是 False。
最后请你们思考这段代码,为何一样的操做会有不一样的结果
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 123
>>> b = 123
>>> a is b
True复制代码
同步发表于博客:foofish.net/what-is-dif…
公众号:Python之禅 (id:VTtalk),分享 Python 等技术干货