调用者是主动发起函数调用的一方,如result = add(3, 5)中写add(3, 5)的代码上下文;被调用者是接收参数、执行逻辑并返回结果的函数,如add本身;二者通过栈帧协作,实现参数传递与控制权转移。

调用者(caller)就是主动发起函数调用的那个部分,被调用者(callee)则是实际执行任务、被别人“叫去干活”的那个函数。关键不在名字多专业,而在于谁先伸手、谁响应动作。
谁是调用者?看代码里谁先写括号
在代码中,调用者是写出 函数名 + 括号 的那一方。比如:
-
result = add(3, 5)中,add(3, 5)这一行所在的上下文(可能是main函数,也可能是另一个函数)就是调用者; -
print(greet("Alice"))中,print是外层调用者,greet是内层被调用者——说明一个函数可以既是调用者,也是被调用者; - 即使没有显式函数名,像
lambda x: x * 2被传给map执行时,map内部就扮演了调用者的角色。
被调用者干啥?接收输入、完成任务、交回结果
被调用者不主动运行,只等被点名。它要做的事很明确:
- 按约定接收参数(形参),这些参数来自调用者传来的实参;
- 在自己的函数体内执行逻辑,比如计算、判断、IO操作;
- 如有返回值,通过
return把结果交还给调用者; - 执行完立刻退出,控制权自动交还给调用者原来暂停的位置。
二者怎么协作?靠栈帧和参数传递
每次调用发生时,系统会在内存中创建一个独立的“工作区”,叫栈帧(stack frame)。这个机制保证了:
- 调用者和被调用者的局部变量互不干扰;
- 即使嵌套调用(A→B→C),也能准确返回到上一层;
- 参数传递有明确规则:Python 和 Java 默认是“对象引用传递”,C/C++ 区分值传递与指针传递,类型匹配错误会直接报错或产生意外行为。
容易混淆的点
有些情况看似模糊,其实有明确归属:
-
def f(): return g()——f是调用者,g是被调用者; -
callbacks[0]()—— 数组里的函数被调用,callbacks[0]是被调用者,方括号外的代码是调用者; - 递归函数如
factorial(n):当它调用factorial(n-1),自己同时是调用者和被调用者,只是不同调用层级而已。











