|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
想问一下要怎么理解闭包呢,比如在下面的程序中,为啥move(-2,2)是在原有(x=1,y=2)的情况下移动,而不是(x=0,y=0)呢?
>>> def outer():
... x=0
... y=0
... def inner(x1,y1):
... nonlocal x,y
... x+=x1
... y+=y1
... print(f'现在,x={x},y={y}')
... return inner
...
>>> move=outer()
>>> move(1,2)
现在,x=1,y=2
>>> move(-2,2)
现在,x=-1,y=4
在Python中,闭包是由函数以及创建该函数时存在的自由变量的环境组成的实体。
当鱼油在一个函数内部定义另一个函数,并且内部函数引用了外部函数的变量时,就创建了一个闭包。
在图中的例子中,outer 函数定义了变量 x 和 y,然后定义了内部函数 inner。
inner 函数通过使用 nonlocal 关键字声明,它将引用并可以修改 outer 函数的局部变量 x 和 y。
当 outer 函数被调用并返回 inner 函数时,它实际上返回了一个闭包。
这个闭包记住了 x 和 y 的当前值,即使在 outer 函数的执行上下文已经结束之后。
因此,当您第一次调用 move(1,2) 时,它更新了 x 和 y 的值。
由于闭包记住了这些值,当您再次调用 move(-2,2) 时,它是在已更新的 x 和 y 值的基础上进行操作的。
这就是为什么 move(-2,2) 的调用是在 x=1, y=2 的情况下移动的,而不是从 x=0, y=0 开始。
每次调用 move 实际上都是在修改同一闭包环境中的 x 和 y,这个环境是在第一次调用 outer() 并赋值给 move 时创建的。
|
|