python is

Case 1

>>> a = [1, 2]
>>> b = [1, 2]
>>> a == b
True
>>> a is b
False

阐述 == 和 is 的区别前,先要明确 Python 的一个概念,一切皆对象,每个对象包含一个 identity、一个 type 和一个 value

Everything in Python is an object.
Every object has an identity, a type and a value.

identity 表示对象所在的地址空间,可用 id() 查看:

>>> id(a)
4539217360
>>> id(b)
4539217488

运算符 is 比较两个对象的地址空间是否相同,即判断二者是否为同一个对象,a is b 相当于 id(a) == id(b)。

Case 2

>>> class A(object):
...     def __eq__(self, other):
...         return True
...
>>> a = A()
>>> a == 1
True
>>> a == 2
True
>>> a == "abcdefg"
True

再有趣点:

>>> class B(A):
...     def __ne__(self, other):
...         return True
...
>>> b = B()
>>> b == 1
True
>>> b != 1
True

在一切皆为对象的 Python 里,操作符 == 调用对象的 __eq__() 方法,同理有:

+--------+-------------+
| x == y | x.__eq__(y) |
| x != y | x.__ne__(y) |
| x <= y | x.__le__(y) |
| x < y  | x.__lt__(y) |
| x > y  | x.__gt__(y) |
| x >= y | x.__ge__(y) |
+--------+-------------+

Case 3

>>> a = 1
>>> b = 1
>>> a == b
True
>>> a is b
True
>>>
>>> a = 100000
>>> b = 100000
>>> a == b
True
>>> a is b
False

此例告知我们,Python 会缓存一些较小的 int 和 str 对象,减少热点数据频繁调用的开销;另外所有的 None 对象都指向相同的地址空间,类似的还有 False 和 True,所以有如下常用的用法:

if a is None:
    ...

if a is True:
    ...