Python 全栈:Python 对象间的相等性比较等使用总结

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,如下所示:

还有 72% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
支付 ¥1.99 继续阅读

相关阅读更多精彩内容

友情链接更多精彩内容