3. is 和 ==
3.1. is 和 ==
is
的作用是用来检查对象的标示符(object identity)是否一致,也就是比较两个对象在内存中的地址是否一样,而 ==
是用来检查两个对象是否相等。
我们在检查 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的值也相等。
1>>> a = "hello"
2>>> b = "hello"
3>>> a == b
4True
5>>> a is b
6False
7
8>>> a = [1,2,3]
9>>> b = a
10>>> a == b
11True
12>>> a is b
13True
3.2. None
与 None
比较是 is None
而不是 == None
。
这是因为 None
在Python里是个单例对象(singleton):一个变量如果是 None
,它一定和 None
指向同一个内存地址。
而 == None
背后调用的是 __eq__
,而 __eq__
可以被重载,下面是一个 is not None
但 == None
的例子。
1class Foo(object):
2 def __eq__(self, other):
3 return True
4
5foo = Foo()
6print foo == None # True
7print foo is None # False
3.3. 参考资料
经典7大Python面试题