鱼C论坛

 找回密码
 立即注册
查看: 1335|回复: 2

闭包的函数调用多次为什么得到的值是在之前的基础上累加的

[复制链接]
发表于 2023-11-1 23:37:19 | 显示全部楼层 |阅读模式

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

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

x
def outer():
  x = 0
  y = 0
    def inner(x1 y1):
      nolocal x, y
      x += x1
      y += y1
      print(f'x = {x}, y = {y}')
    return inner



move = outer()
move(1 , 2)
move(-2 . 2)
为什么调用两次move,第二次的move得到的x = -1 ,y  = 4 ,为什么是在第一次move得到的结果上累加的,不是重新执行了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-1 23:37:27 | 显示全部楼层
闭包内部的变量是可以被保留的,因为内部函数inner引用了外部函数outer的变量x和y,所以在每次调用inner时都会在内存中保留x和y的值,而不是重新定义。因此,第二次调用move时,x和y的值是在第一次调用时的基础上累加的。如果要重新定义x和y的值,可以在外部函数中重新定义它们。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-1 23:39:36 | 显示全部楼层
问题描述: 在Python中,当多次调用闭包函数时,为什么第二次调用得到的结果是在第一次结果的基础上累加的?我以为每次调用都会重新执行闭包函数。

解决方案:

在你提供的代码中,outer函数返回的是一个内部函数inner,而不是直接的结果。这里涉及到了闭包的概念。闭包是指一个函数能够访问并操作其自身范围之外的变量。在这个例子中,inner函数可以访问和修改xy,即使它们是在outer函数作用域之外定义的。

当你第一次调用move函数时,内部函数inner被创建并返回,此时的xy都是初始值0。然后,你通过调用move(1, 2)传递了参数(1, 2),导致x增加了1,y增加了2,然后打印出了结果x = 1, y = 2

但是,当你第二次调用move函数时,实际上并没有重新执行outer函数和创建新的inner函数。相反,由于闭包的特性,已经存在的inner函数仍然存在,并且可以访问和修改之前的状态。因此,第二次调用move(-2, 2)时,x减去了2变为-1,y增加了2变为4,然后打印出了结果x = -1, y = 4

闭包的特性允许内部函数保持对其创建时作用域的引用,以便在后续调用中继续访问和修改其中的变量。这就是为什么第二次调用得到的结果是在第一次结果的基础上累加的。

希望以上解答能够帮助你理解闭包及其工作原理。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 13:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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