TypeError: 'callable' object is not iterable 是因将函数、方法或类等可调用对象误作可迭代对象使用,最常见原因是调用时遗漏括号(如写 range 而非 range()),需检查报错行附近变量类型并补全调用。

为什么会出现 TypeError: 'callable' object is not iterable?
这个错误不是说你写了错的语法,而是 Python 在某个需要遍历(比如 for、list()、sum())的地方,意外收到了一个函数或类实例(即 callable),却试图把它当容器用。最常见的是:把函数名写漏了括号,导致传入的是函数本身,而不是它返回的结果。
- 典型场景:想迭代
range(5)却写了range(没加括号) - 常见于调用自定义函数后忘记加
(),比如get_items而非get_items() - 也可能是误把类名当实例用,例如
MyList而非MyList() - 某些库的 API 返回可调用对象(如
functools.partial),但你直接拿它去for x in partial_func:
如何快速定位出问题的 callable?
错误信息里通常不会直接告诉你哪个变量是 callable,得靠打印类型和值来排查。重点检查报错行附近所有被用于迭代的对象。
- 在报错行前加
print(type(x), repr(x)),其中x是你正尝试迭代的变量 - 如果输出类似
或,就确认它是 callable - 特别注意链式调用,比如
data.items(属性) vsdata.items()(方法)——字典的.items是方法,不加括号就是 callable - 使用
callable(x)快速验证:返回True就说明它不能直接迭代
修复方法:补括号、解包或显式调用
核心原则:确保你迭代的是一个实际可迭代对象(list、tuple、generator、dict_keys 等),而不是它的构造者或包装器。
- 函数调用漏括号 → 补上:
for x in my_func():而非for x in my_func: - 误用方法名 → 加括号:
for k, v in d.items():,不是d.items - 返回 callable 的工厂函数 → 显式调用一次:
gen = make_generator(); for x in gen(): - 想迭代
functools.partial的结果?不行,得先调用它生成真实可迭代对象:result = partial_func(); for x in result: - 若函数本应返回可迭代对象但没返回(比如忘了
return),需修正函数逻辑
容易被忽略的边界情况
有些 case 看似合理,实则危险。比如用 map、filter 后直接迭代没问题,但若中间某步意外返回了 callable,就会爆这个错。
-
map(str.upper, items)是可迭代的;但map(str.upper)(少传第二个参数)会返回一个 callable(Python 3.12+ 报错更明确) - 使用装饰器后,原函数可能被替换成 callable 包装器,而该包装器未实现
__iter__—— 需确认装饰器是否保留了可迭代性 - Jupyter 中变量名和函数名冲突:定义了
data = [1,2,3]后又定义def data(): return [4,5],之后再用data可能引用到函数而非列表 - 动态导入或 getattr 获取函数时,没加
():例如func = getattr(module, 'parse'); for x in func:→ 应为for x in func():
真正卡住人的往往不是语法错误,而是那个「看起来像数据、其实是个函数」的变量,在嵌套调用或动态上下文中悄无声息地混了进来。多打一行 type() 和 callable(),比猜半天快得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











