为什么Python中ndarray的all()、any()返回值用is判断布尔值总返回False
Numpy的any()/all()返回值用
is True/is False判断失效的原因 现象复现
相关问题可以用如下代码复现:
import numpy as np a = np.array([True, False, True]) # 不符合预期的写法 print(a.any() is False) # 输出 False print(a.any() is True) # 输出 False # 符合预期的写法 print(a.any() == True) # 输出 True print(a.any() == False) # 输出 False
核心原因
- Python中的
is运算符判断的是两个对象是否为内存中同一个实例,对比的是对象的内存地址,不是值。Python内置的True和False是全局唯一的单例对象,只有和它们完全是同一个实例的时候is判断才会返回True。 - Numpy的
any()、all()方法返回的不是Python原生的bool类型,是numpy自定义的numpy.bool_类型对象,哪怕值和True/False完全相等,也和Python内置的True/False不是同一个内存地址的对象,所以用is判断必然返回False。 - 而
==运算符对比的是两个对象的值是否相等,numpy.bool_类型已经实现了和原生bool类型的相等比较逻辑,只要值一致就会返回True,符合预期。
你可以用如下代码验证返回值类型:
res = a.any() print(type(res)) # 输出 <class 'numpy.bool_'> print(type(True)) # 输出 <class 'bool'>
最佳实践
- 对于numpy的布尔类返回值,不要用
is True/is False做判断,优先直接用if a.any():或者if not a.all():的写法,Python会自动完成真值判断,不需要额外加比较运算符。 - 如果需要显式比较,用
==运算符即可。
内容的提问来源于stack exchange,提问作者someone_noone
相关产品推荐
相关产品推荐

