xy-xuan 发表于 2023-9-5 17:28:41

为什么用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

isdkz 发表于 2023-9-5 17:29:17

问题的关键在于对于函数调用方式的理解。让我们来分析一下。

首先,我们定义了一个名为 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]
查看完整版本: 为什么用fib()()的方式调用函数会重复输出0但f=fib(),f()的调用方式结果可以叠加?