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面试题