最安全方式是用 collections.abc.iterable 进行 isinstance() 检查,因仅 hasattr(obj, '__iter__') 无法保证 iter 可调用或返回合法迭代器,而 abc 能真正验证迭代协议并支持类型检查与自定义注册。

判断一个对象是否为可迭代对象,最安全、推荐的方式是使用 collections.abc.Iterable 进行 isinstance() 检查,而不是依赖 hasattr(obj, '__iter__') 或尝试 iter() + 异常捕获。
为什么不能只看 __iter__ 属性?
某些对象虽然有 __iter__ 属性,但它可能不是可调用的(比如被意外赋值为整数),或返回非迭代器对象,导致后续 for 循环失败。例如:
class BadIterable:
__iter__ = 42 # 不是方法,也不是可调用对象
此时 hasattr(obj, '__iter__') 返回 True,但 iter(obj) 会报 TypeError。
正确方式:用 collections.abc.Iterable
这是 Python 官方抽象基类(ABC)定义的“可迭代”协议,会真正检查对象是否满足迭代器协议(即 __iter__ 返回可迭代对象,或实现了 __getitem__ 且支持从 0 开始的整数索引)。
立即学习“Python免费学习笔记(深入)”;
- ✅ 兼容所有标准可迭代类型(
list,str,tuple,dict,set, 生成器等) - ✅ 支持用户自定义类通过继承或注册方式声明可迭代性
- ✅ 静态类型检查工具(如 mypy)也能识别该判断逻辑
代码示例
推荐写法:
from collections.abc import Iterable
<p>def is_iterable(obj):
return isinstance(obj, Iterable)</p><h1>测试</h1><p>print(is_iterable([1, 2, 3])) # True
print(is_iterable("hello")) # True
print(is_iterable(42)) # False
print(is_iterable(iter([1]))) # True(迭代器本身也是可迭代的)
注意:iter() 函数本身会做更严格的运行时检查,但抛异常成本高,不适合做前置判断;而 isinstance(..., Iterable) 是轻量、语义明确、符合 Python 惯例的安全方式。
补充说明:字符串和字节串的特殊性
默认情况下,str 和 bytes 是 Iterable,这有时不符合业务预期(比如你希望“字符串不算可迭代,只算原子值”)。这时需额外排除:
def is_nonstring_iterable(obj):
return isinstance(obj, Iterable) and not isinstance(obj, (str, bytes))
这种处理常见于序列扁平化、嵌套结构遍历等场景,避免把字符串逐字符展开。










