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. 参考资料

  1. 经典7大Python面试题