Python TypeError: 'bool' object is not iterable报错解决
报错产生原因
all()是Python内置的聚合判断函数,必须传入可迭代对象(列表、生成器、元组等可遍历的结构)作为参数,它会遍历入参的每一个元素,当所有元素都为真值时返回True,否则返回False。- 你原始代码里写的
all(v == 0),传入的参数是v == 0的运算结果——这是一个单次布尔比较,返回值只能是True或者False,属于布尔类型,本身是不可遍历的。当all()尝试遍历这个布尔值的时候,就会抛出TypeError: 'bool' object is not iterable错误。 - 原始代码还有额外的逻辑问题:你把全零判断写在了
for v in thelist的循环内部,就算参数传对,也会在遍历每一个列表元素的时候重复执行一次全列表校验,既浪费性能,还会针对每个元素重复打印判断结果,不符合需求。
使用
all()判断列表所有值为0的正确实现 核心要求是给all()传入「遍历列表每个元素做等值判断」的可迭代结构,同时把全量判断放在元素遍历循环的外部,避免重复执行。
标准写法示例
def checklist(thelist): if len(thelist) > 2: # 单次遍历检查是否存在负值 for v in thelist: if v < 0.0: print("One negative") # 全零判断:传入生成器表达式,逐个校验列表元素是否等于0 if all(vs == 0 for vs in thelist): print("All zero") else: print("All good") alist = [0.0, -0.1, 0.3, 0.0] checklist(alist)
注意事项
- 如果列表里的0是浮点计算得到的结果,不建议直接用
==判断,应该用精度阈值规避浮点误差,比如写成all(abs(vs) < 1e-9 for vs in thelist)。 - 也可以给
all()传入列表推导式作为参数,比如all([vs == 0 for vs in thelist]),但生成器表达式不需要提前生成完整的布尔值列表,内存占用更低,长列表场景下性能更好。 - 不要把全列表判断放在单元素遍历的循环内部,否则列表长度为N就会重复执行N次全量校验,属于无意义的性能损耗。
内容的提问来源于stack exchange,提问作者Wupppa
相关产品推荐
相关产品推荐

