Python 中,对象相等性比较相关关键字包括 is、in,比较运算符有 ==。
- is 判断两个对象的标识号是否相等;
- in 用于成员检测
-
==用于判断值或内容是否相等,默认是基于两个对象的标识号比较。
也就是说,如果 a is b 为 True 且如果按照默认行为,意味着 a==b 也为 True。
下面详细介绍它们的用法。
is 判断标识号是否相等
is 比较的是两个对象的标识号是否相等,Python 中使用 id() 函数获取对象的标识号。
In [1]: a = [1,2,3]
In [2]: id(a)
Out[2]: 95219592
In [5]: b = [1,2,3] #再创建一个列表实例,元素取值也为 1,2,3
In [6]: id(b)
Out[6]: 95165640
创建的两个列表实例位于不同的内存地址,所以它们的标识号不等。
In [7]: a is b
Out[7]: False
即便对于两个空列表实例,它们 is 比较的结果也是 False:
In [17]: a, b = [], []
In [18]: a is b
Out[18]: False
对于序列型、字典型、集合型对象,一个对象实例指向另一个对象实例,is 比较才返回真值。
In [19]: a, b = {'a':[1,2,3]},{'id':'book id', 'price':'book price'}
In [20]: a = b
In [21]: a is b
Out[21]: True
对于值类型而言,不同的编译器可能会做不同的优化。从性能角度考虑,它们会缓存一些值类型的对象实例。所以,使用 is 比较时,返回的结果看起来会有些不太符合预期。注意观察下面两种情况,同样的整数值,使用 is 得到不同结果。
In [100]: a = 123
In [101]: b = 123
In [102]: a is b
Out[102]: True
In [103]: c = 123456
In [104]: d = 123456
In [105]: c is d
Out[105]: False
Python 解释器,对位于区间 [-5,256] 内的小整数,会进行缓存,不在该范围内的不会缓存,所以才出现上面的现象。
Python 中 None 对象是一个单例类的实例,具有唯一的标识号,如下所示:
In [23]: id(None)
Out[23]: 140722146270432
在判断某个对象是否为 None 时,最便捷的做法:variable is None,如下所示: