Python中is与==判断的区别
在Python中,比较两个对象(变量)是否相等,可以用“is”和“==”操作,但它俩有什么区别?什么时候用“is”,什么时候用“==”?在面试时,发现不少候选人很难把这两者完全说清楚,因此在这篇文章中,「Python之禅」将对二者进行深入浅出的对比介绍。
先举个例子
小黄最近手头非常宽裕,花重金购买了一辆P90D特斯拉,我们暂且给这车取名叫"小P",这辆车和隔壁老王家的车(车名叫"小王")是一模一样的,无论是型号、外表还是价格都一样,是同批次生产的。这里我们可以说"小P"和"小王"是两辆一模一样的、相等的(euqal),但本质上这是两个不同的对象。有一天小君给他的爱车又取了一个网名叫"爱驹",当我们说"小P"的时候其实就是在讨论"爱驹",因为本质上两个名字指的是同一个对象,这里我们把"小P"和"爱驹"称为完全相等的(identical)。
在Python中,”==”和“is”的区别可类比这个例子,前者是相等性比较,比较的是两个对象中的值是否相等,后者是一致性比较,比较的是两个对象的内存空间地址是否相同。
显然,如果内存地址相同,那么他们的值肯定也是一样的,因此,如果“is”返回True,那么“==”一定也返回True,反之却不成立。
talkischeap,showmethecode
先创建一个列表对象,然后给它指定一个名字a,再定义另外一个变量b,让它指向同一个对象。
>>>a=[1,2,3] >>>b=a
a和b打印的值都是相等的,因为这两个变量指向的是同一个对象,就好比给一辆车起了两个不同的名字。
>>>a [1,2,3] >>>b [1,2,3]
理所当然,is和==都返回True。
>>>a==b True >>>aisb True
创建一个新的对象,尽管值是一样的,但是他们本质上是两个不同的对象,处在两个不同的内存空间,因此"is"返回的是False。
>>>c=[1,2,3] >>>aisc False
有且当仅比较的两个变量指向同一个对象时"is"才返回True,而"=="最终取决于对象的__eq__()方法,本质上两个变量进行"=="比较操作调用的是对象的__eq__()方法。例如:
>>>classFoo(object): def__eq__(self,other): returnTrue >>>f=Foo() >>>f==1 True >>>f==None True >>>fisNone False
因为自定义类Foo的eq方法恒返回True,因此它与任何对象进行"=="都是返回True。而它与None是两个不同的对象,因此'is'操作返回的是False。
最后请大家思考这段代码,为什么同样的操作会有不同的结果
>>>a=257 >>>b=257 >>>aisb False >>>a=123 >>>b=123 >>>aisb True
总结:
如果你要比较两个值是否相同就用==,如果比较是否是同一个对象就用is.
其实python中的is比较的对象很像C语言中的指针,只有地址相同的指针才是同一个指针.