为什么用fib()()的方式调用函数会重复输出0但f=fib(),f()的调用方式结果可以叠加?
def fib():x = 0
y = 1
def fib_():
nonlocal x , y
result = x
x = y
y = x + y
return result
return fib_
fib()()
0
fib()()
0
fib()()
0
f = fib()
f()
0
f()
1
f()
2 问题的关键在于对于函数调用方式的理解。让我们来分析一下。
首先,我们定义了一个名为 fib 的函数,它返回了一个内部函数 fib_ 。 fib_ 函数通过使用 nonlocal 关键字来引用外部函数 fib 中的变量 x 和 y 。
当我们使用 fib()() 的方式调用函数时,实际上是先调用了外部函数 fib ,然后再调用了内部函数 fib_ 。每次调用 fib_ 函数,它都会返回变量 x 的值,并更新 x 和 y 的值。但是,由于每次调用 fib() 时都会创建一个新的 fib_ 函数实例,所以每次调用 fib_ 函数时,它都会使用最初定义的初始值 x=0 来计算结果,导致每次调用都返回0。
相反,当我们使用 f = fib() 的方式调用函数时,实际上是将外部函数 fib 的返回值赋给了变量 f 。这意味着 f 实际上是一个指向内部函数 fib_ 的引用。因此,每次调用 f() 时,它都会使用 fib_ 函数中最新的 x 和 y 的值来计算结果。由于 f 引用的是同一个函数实例,所以每次调用都会叠加计算结果。
因此, fib()() 的方式会重复输出0,而 f=fib(),f() 的方式可以叠加计算结果。
页:
[1]