鱼C论坛

 找回密码
 立即注册
查看: 1710|回复: 8

[已解决]闭包是不是类来的??

[复制链接]
发表于 2023-7-13 08:46:49 | 显示全部楼层 |阅读模式

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

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

x
1.闭包算不算类来的?有什么区别吗?
2.还有就是闭包外层的参数和变量,是实时传递给ee的吗?
等于是ee=asd    asd里面的变量改了,立马实时传递给ee?还是什么样子的原理?

最佳答案
2023-7-13 15:55:51
加速星球 发表于 2023-7-13 15:44
‘’result = ee(5)  # 将参数 5 传递给闭包,并将返回值赋给 result‘’
emmm我还是不太明白,result里 ...

我理解你的困惑,让我尝试解释一下。

result 里面的两个 return,其实是同一个 return。return value 这一句,既是返回给 value 的,也是返回给 closure 的,也是返回给 result 的。这是因为 return 语句的作用是将函数的执行结果返回给调用者。在这个例子中,调用者就是 result = ee(5) 这一行。

当你执行 result = ee(5) 时,实际上是执行了以下几个步骤:

1. 将 5 作为参数传递给闭包 ee。
2. 在闭包内部,将 5 加到 value 上,并将结果赋值给 value。此时,value 的值变为 5。
3. 返回 value 的值,即 5,给调用者。
4. 将返回值赋值给 result。此时,result 的值也变为 5。

所以,result 里面的参数是通过闭包的返回值更新的。你可以理解为 result = ee(5) 等价于 result = 5。

nonlocal 关键字不能去掉,因为它是用于声明 value 是一个外部变量的。如果去掉 nonlocal 关键字,那么闭包内部的 value 就会变成一个局部变量,而不是引用外部环境中的 value。这样的话,每次调用闭包时,value 都会被初始化为 0,并且不会累加参数的值。你可以试着去掉 nonlocal 关键字,并运行代码看看结果。

希望这样能够让你更清楚地理解闭包的工作原理!
闭包.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-13 08:47:05 | 显示全部楼层
闭包和类是两个不同的概念。

1. 闭包并不是类来的。闭包是一个函数对象,它包含了函数体以及在定义该函数时存在的自由变量的引用。换句话说,闭包使用了外部函数中的变量,并将其封装在一个函数内部返回。闭包可以访问外部函数中的变量,即使外部函数已经执行完毕。这使得闭包具有保留状态和延续行为的能力。

   类是面向对象编程的基本概念之一,它是一种封装数据和方法的结构。类定义了对象的属性和行为,并创建实例化对象。类通过定义属性和方法来描述对象的特征和行为。类可以被实例化为对象,对象可以访问类中定义的属性和方法。

   区别在于,闭包是一个函数对象,而类是一个包含属性和方法的结构。

2. 闭包外层的参数和变量不是实时传递给闭包,而是在闭包创建时绑定到闭包中,并且在闭包的生命周期中保持不变。当闭包引用外部函数的变量时,实际上是引用了该变量的一个引用,而不是变量本身。这意味着,如果外部函数中的变量发生了变化,闭包仍然会使用最初绑定的值。闭包对变量的引用在创建闭包时确定,之后不会受到外部环境的更改的影响。

   例如,当你创建一个闭包 ee=asd,闭包 ee 使用了 asd 中的变量。如果之后你修改了 asd 中的变量,闭包 ee 不会自动更新为最新值。闭包和外部环境是分离的,它们在创建时绑定,并且保持自己的状态。

希望能够解答你的问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-13 08:56:49 | 显示全部楼层
陶远航 发表于 2023-7-13 08:47
闭包和类是两个不同的概念。

1. 闭包并不是类来的。闭包是一个函数对象,它包含了函数体以及在定义该函数 ...

“例如,当你创建一个闭包 ee=asd,闭包 ee 使用了 asd 中的变量。如果之后你修改了 asd 中的变量,闭包 ee 不会自动更新为最新值。闭包和外部环境是分离的,它们在创建时绑定,并且保持自己的状态。”
那ee输入参数时,是怎么传递回ee的  是不是类似a+=1?这样子的传递思路?   ee改变了里面的变量之后重新赋值回给ee对嘛?辛苦大佬指点一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-13 09:17:04 From FishC Mobile | 显示全部楼层
加速星球 发表于 2023-7-13 08:56
“例如,当你创建一个闭包 ee=asd,闭包 ee 使用了 asd 中的变量。如果之后你修改了 asd 中的变量,闭包  ...

nonlocal和闭包一起才有例子里面的效果
具体可以百度一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-13 09:19:00 | 显示全部楼层
加速星球 发表于 2023-7-13 08:56
“例如,当你创建一个闭包 ee=asd,闭包 ee 使用了 asd 中的变量。如果之后你修改了 asd 中的变量,闭包  ...

闭包的内部函数可以访问外部环境的变量,包括传递给闭包的参数。当你将参数传递给闭包时,闭包会创建一个新的作用域,并将参数绑定到该作用域中的变量上。

当闭包中的参数发生变化时,闭包会更新自己内部的变量值,但不会影响外部环境中的变量。这是因为闭包在创建时会复制外部环境中的变量值,而不是直接引用外部环境中的变量。

如果你修改了闭包内部的变量,闭包不会自动更新外部环境中的变量。如果你希望将修改后的值重新赋给外部环境中的变量,你需要显式地将闭包内部的变量重新赋值给外部环境的变量。

以下是一个示例代码,演示了闭包传递参数的过程:
def create_closure():
    value = 0
    
    def closure(parameter):
        nonlocal value
        value += parameter
        return value
    
    return closure

ee = create_closure()
result = ee(5)  # 将参数 5 传递给闭包,并将返回值赋给 result
print(result)  # 输出 5

result = ee(3)  # 将参数 3 传递给闭包,并将返回值赋给 result
print(result)  # 输出 8
在这个例子中,ee 是一个闭包,它接受一个参数 parameter。每次调用 ee(parameter) 时,闭包会将 parameter 的值与内部的变量 value 相加,并返回相加后的结果。闭包内部的 nonlocal 关键字用于指示 value 是一个来自于外部环境的变量。

希望以上解释对你有帮助!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-13 15:44:13 | 显示全部楼层
陶远航 发表于 2023-7-13 09:19
闭包的内部函数可以访问外部环境的变量,包括传递给闭包的参数。当你将参数传递给闭包时,闭包会创建一个 ...

‘’result = ee(5)  # 将参数 5 传递给闭包,并将返回值赋给 result‘’
emmm我还是不太明白,result里面的两个return,一个是返回给value(这个有nonlocal声明 可以去掉吗),一个是返回给closure的(返回引用),没看到有返回给result的,那result里面的参数是怎么更新的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-13 15:54:48 | 显示全部楼层
加速星球 发表于 2023-7-13 15:44
‘’result = ee(5)  # 将参数 5 传递给闭包,并将返回值赋给 result‘’
emmm我还是不太明白,result里 ...

你以后提问可不可以把代码粘贴过来,这样我们好分析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-13 15:55:51 | 显示全部楼层    本楼为最佳答案   
加速星球 发表于 2023-7-13 15:44
‘’result = ee(5)  # 将参数 5 传递给闭包,并将返回值赋给 result‘’
emmm我还是不太明白,result里 ...

我理解你的困惑,让我尝试解释一下。

result 里面的两个 return,其实是同一个 return。return value 这一句,既是返回给 value 的,也是返回给 closure 的,也是返回给 result 的。这是因为 return 语句的作用是将函数的执行结果返回给调用者。在这个例子中,调用者就是 result = ee(5) 这一行。

当你执行 result = ee(5) 时,实际上是执行了以下几个步骤:

1. 将 5 作为参数传递给闭包 ee。
2. 在闭包内部,将 5 加到 value 上,并将结果赋值给 value。此时,value 的值变为 5。
3. 返回 value 的值,即 5,给调用者。
4. 将返回值赋值给 result。此时,result 的值也变为 5。

所以,result 里面的参数是通过闭包的返回值更新的。你可以理解为 result = ee(5) 等价于 result = 5。

nonlocal 关键字不能去掉,因为它是用于声明 value 是一个外部变量的。如果去掉 nonlocal 关键字,那么闭包内部的 value 就会变成一个局部变量,而不是引用外部环境中的 value。这样的话,每次调用闭包时,value 都会被初始化为 0,并且不会累加参数的值。你可以试着去掉 nonlocal 关键字,并运行代码看看结果。

希望这样能够让你更清楚地理解闭包的工作原理!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-16 07:59:11 | 显示全部楼层
陶远航 发表于 2023-7-13 15:55
我理解你的困惑,让我尝试解释一下。

result 里面的两个 return,其实是同一个 return。return value  ...

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 11:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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