Big-Man 发表于 2023-11-1 23:37:19

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

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得到的结果上累加的,不是重新执行了吗

isdkz 发表于 2023-11-1 23:37:27

闭包内部的变量是可以被保留的,因为内部函数inner引用了外部函数outer的变量x和y,所以在每次调用inner时都会在内存中保留x和y的值,而不是重新定义。因此,第二次调用move时,x和y的值是在第一次调用时的基础上累加的。如果要重新定义x和y的值,可以在外部函数中重新定义它们。

Mike_python小 发表于 2023-11-1 23:39:36

问题描述: 在Python中,当多次调用闭包函数时,为什么第二次调用得到的结果是在第一次结果的基础上累加的?我以为每次调用都会重新执行闭包函数。

解决方案:

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

当你第一次调用move函数时,内部函数inner被创建并返回,此时的x和y都是初始值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。

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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 闭包的函数调用多次为什么得到的值是在之前的基础上累加的