鱼C论坛

 找回密码
 立即注册
查看: 1618|回复: 1

[已解决]为什么用fib()()的方式调用函数会重复输出0但f=fib(),f()的调用方式结果可以叠加?

[复制链接]
发表于 2023-9-5 17:28:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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
最佳答案
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() 的方式可以叠加计算结果。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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() 的方式可以叠加计算结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 15:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表