闭包是不是类来的??
1.闭包算不算类来的?有什么区别吗?2.还有就是闭包外层的参数和变量,是实时传递给ee的吗?
等于是ee=asd asd里面的变量改了,立马实时传递给ee?还是什么样子的原理?
闭包和类是两个不同的概念。
1. 闭包并不是类来的。闭包是一个函数对象,它包含了函数体以及在定义该函数时存在的自由变量的引用。换句话说,闭包使用了外部函数中的变量,并将其封装在一个函数内部返回。闭包可以访问外部函数中的变量,即使外部函数已经执行完毕。这使得闭包具有保留状态和延续行为的能力。
类是面向对象编程的基本概念之一,它是一种封装数据和方法的结构。类定义了对象的属性和行为,并创建实例化对象。类通过定义属性和方法来描述对象的特征和行为。类可以被实例化为对象,对象可以访问类中定义的属性和方法。
区别在于,闭包是一个函数对象,而类是一个包含属性和方法的结构。
2. 闭包外层的参数和变量不是实时传递给闭包,而是在闭包创建时绑定到闭包中,并且在闭包的生命周期中保持不变。当闭包引用外部函数的变量时,实际上是引用了该变量的一个引用,而不是变量本身。这意味着,如果外部函数中的变量发生了变化,闭包仍然会使用最初绑定的值。闭包对变量的引用在创建闭包时确定,之后不会受到外部环境的更改的影响。
例如,当你创建一个闭包 ee=asd,闭包 ee 使用了 asd 中的变量。如果之后你修改了 asd 中的变量,闭包 ee 不会自动更新为最新值。闭包和外部环境是分离的,它们在创建时绑定,并且保持自己的状态。
希望能够解答你的问题! 陶远航 发表于 2023-7-13 08:47
闭包和类是两个不同的概念。
1. 闭包并不是类来的。闭包是一个函数对象,它包含了函数体以及在定义该函数 ...
“例如,当你创建一个闭包 ee=asd,闭包 ee 使用了 asd 中的变量。如果之后你修改了 asd 中的变量,闭包 ee 不会自动更新为最新值。闭包和外部环境是分离的,它们在创建时绑定,并且保持自己的状态。”
那ee输入参数时,是怎么传递回ee的是不是类似a+=1?这样子的传递思路? ee改变了里面的变量之后重新赋值回给ee对嘛?{:5_91:}辛苦大佬指点一下 加速星球 发表于 2023-7-13 08:56
“例如,当你创建一个闭包 ee=asd,闭包 ee 使用了 asd 中的变量。如果之后你修改了 asd 中的变量,闭包...
nonlocal和闭包一起才有例子里面的效果
具体可以百度一下 加速星球 发表于 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 是一个来自于外部环境的变量。
希望以上解释对你有帮助!如果还有其他问题,请随时提问。 陶远航 发表于 2023-7-13 09:19
闭包的内部函数可以访问外部环境的变量,包括传递给闭包的参数。当你将参数传递给闭包时,闭包会创建一个 ...
‘’result = ee(5)# 将参数 5 传递给闭包,并将返回值赋给 result‘’
emmm我还是不太明白,result里面的两个return,一个是返回给value(这个有nonlocal声明 可以去掉吗),一个是返回给closure的(返回引用),没看到有返回给result的,那result里面的参数是怎么更新的 加速星球 发表于 2023-7-13 15:44
‘’result = ee(5)# 将参数 5 传递给闭包,并将返回值赋给 result‘’
emmm我还是不太明白,result里 ...
你以后提问可不可以把代码粘贴过来,这样我们好分析 加速星球 发表于 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 关键字,并运行代码看看结果。
希望这样能够让你更清楚地理解闭包的工作原理! 陶远航 发表于 2023-7-13 15:55
我理解你的困惑,让我尝试解释一下。
result 里面的两个 return,其实是同一个 return。return value...
好的谢谢
页:
[1]