你所熟知的各种编程语言,都有形参与实参这个概念,虽然不同语言对于形参和实参的要求是不同的,但他们存在的形式与意义却是一致的。
对于许多初学者来说,形参与实参,着实难以区分和理解,这不怪你,因为计算机里的很多概念,的确是难以理解。我们对于日常生活中许多事物的理解,已经让我们养成了思维上的习惯与定式,而这种定式放在计算机编程上,往往是失效的。原因在于,计算机里的许多概念,都是没有实体的。
比如说,内存,你不能指着某样东西说“看,这是内存”, 充其量,你拆开电脑,指着一块硬件说“看,这是内存条”,然尔内存与内存条是两个完全不同的事物。所以,我们要放弃自然科学中那种对事物进行精确定义和描述的习惯。
看下面这段代码
代码语言:javascript复制def add(x, y):
return x y
x, y ,就是函数add的形参,形参这个概念,侧重于函数的定义,这段代码里,没有实参,因为实参侧重于函数的调用,看下面这段代码
代码语言:javascript复制def add(x, y):
return x y
add(3, 4)
3 和 4 就是调用函数add时传入的实参,这句话强调了调用函数和传入两个动作,只有当这两个动作发生时,才有实参的概念,或者说,实参的概念才有意义。
那么,return x y 这行代码里,x 与 y 是实参,还是形参呢? 我个人的见解是,在函数里再去辨别他们已经没什么意义,如果一定需要一个答案,那么,我认为它们是形参,而不是实参。实参,是一个只在函数调用时存在的概念,具体到函数内部执行时,我们已经不关心实参这个事情了。
如果你对变量作用域理解的不深刻,那么下面这段代码很容易让你困惑
代码语言:javascript复制x = 3
y = 4
def add(x, y):
return x y
add(x, y)
现在再来看,return x y 这行代码里,x y 到底是实参还是形参?答案是形参。实参,不是一个具体的事物,它是一个概念,这个概念只在调用函数传入参数时才有意义。
为什么要有形参和实参这两个概念呢?形参,规定了函数的样式,是一种形式的约定,强类型语言还会约定一个形参的类型。实参,是实际调用时传入函数的数据,因此叫实参。
实参与形参,是两个维度的事物,一个强调形式,一个强调实际数值,因此我说,他们是两个维度的事物,形参是静态的概念,实参是动态的概念,我执行add(3, 5), 函数的实参就是3, 5。下一次执行add(7, 8),那么函数的实参就是7和8,但形参始终都是x和y。
在函数内,形参的值,是由实参决定的,在函数执行之前,你不知道x 和 y 的值是什么,只有函数实际被执行,被调用,在函数内,你才知道形参的实际数值是什么。