【python技巧060】形象理解闭包,玩转闭包

作者: __阿岳__分类: 计算机技术 发布时间: 2023-01-16 06:44:56 浏览:43771 次

【python技巧060】形象理解闭包,玩转闭包

Thlnk:
闭包相当于一个定义了一个微小的类。 类的属性就是闭包被访问的外部变量,类的访问类的属性非静态方法就是闭包函数。 每次调用闭包生成函数的过程,就是类的初始化过程,初始化了闭包函数用到了的属性。 而类的静态方法,不能使用非静态的属性的原理就在这里。 闭包不能直接通过点访问内部属性,只能通过闭包函数间接访问,从而实现了对属性的封装。类似Java中的private属性+getter setter方法访问控制。所以闭包在纯面向对象用处较小。 js在ES6之前实现类的方法,其中之一,就是通过类实现的。 在脚本语言中,定义一个类代价太过高昂,而灵活的闭包却可以方便的实现。 好的程序就是在可大可小的工具中自由穿梭而运行稳定,表述清晰。我们像这样的目标进军[打call]

【回复】说闭包是类是否有点本末倒置 不如说类是闭包
【回复】纠个错 每次调用闭包生成函数的过程,是创建实例的过程,初始化了实例中的属性
【回复】回复 @爱薄荷糖的骚年 :这个要到底层编译原理那边去找了,不是代码编写的问题,是如何让机器执行的问题
SeanYFBan:
打包带走。 内层函数g把外层f的局部变量a装好, 然后外层的f把g送走, 这样g就带着a去任何地方享用而不用受f限制了。

【回复】讲的好。通俗易懂。哈哈[呲牙]
【回复】你这个解释,我懂了,厉害👍
苏小寡:
我觉得深拷贝那块儿,可能不太准确。f执行两次,对a变量的赋值操作也会执行两次,那么a变量肯定是不同的地址了。就像程序运行两次,同名变量肯定不会互相影响。

【回复】回复 @littlefean :如果要证明up深拷贝的说法,应该给从最外层给f两次传入同一个参数a,再在g里使用这个a[吃瓜]
【回复】回复 @bujianduan : 是深拷贝, a = 6, 当a作为普通变量时, 赋值操作改变地址, 但是a = [【1】, 【2】], 此时的a为列表, 对a列表进行改变, 不改变内存地址.
【回复】哦对,好像是,视频做的仓促了
天高凭鸟飞宇阔任我皮:
我不能动我儿子的小玩具, 我儿子却花我的钱[滑稽] , 这臭小子把这钱竟然给班上小红买雪糕[大哭] ——小红不能直接花我的钱,但通过我儿子花了我的钱。[doge]

巴拉巴拉丨:
闭包是外来词,直译来的。我觉得可以叫套壳,通俗易懂[呲牙]

视卿如风月:
不太懂闭包是啥意思. 但是我以学python的时候查过: 函数不加括号, 函数加括号, 函数加多个括号,3者之间的区别, 感觉这个概念的逻辑绕清楚了,就不用懂什么闭包不闭包了, 为啥现在讨论技术就喜欢乱造一堆新的名词来让人听不懂, 像很多人把规定的数据区间说成"数据口径"来装逼, 故意让人听不懂, 显得自己多专业似的, 导致更多人需要浪费时间去了解这些无意义的新名词的意思, 这些人真的挺欠揍.

【回复】额额,说明你确实没搞懂,搞懂了再来发言吧
【回复】回复 @视卿如风月 : 你这个发言会误导进来看这个视频的新手,你确实有发言的权利,我没有不让你发言,我让你搞懂了再来发言。你看看我说的哪一个字让你不发言了?
【回复】函数加括号和闭包不闭包没什么直接关系
神楽一葉:
闭包可以看作函数定义时的“环境”。“环境”就是函数所处的词法域中各个变量引用的值。其实用几行代码就很好理解了,以下是common lisp (defparameter *f* (let ((count 0)) #'(lambda () (setf count (+ 1 count))))) 然后一次次调用函数对象*f*,得到这个闭包中的count值是: (funcall *f*) -> 1 (funcall *f*) -> 2 (funcall *f*) -> 3 如果熟悉面向对象的话,可以把一个闭包作为一个“对象”来理解。事实上,scheme语言实现面向对象就是用这种方式。

【回复】每个闭包就是把它的“环境”永远一起带着,使用或者修改。“环境”是一个拷贝,不互相影响
【回复】跟up主说的差不多,算是一个总结吧。感兴趣这些东西的话非常建议读一下sicp
ILo0O:
道理都懂,关键是内存为什么不会被释放, ❤因为,也就是在同一个栈,所有变量都可以访问。 ①js高级程序设计里说: #闭包是函数 #一个可以访问别的函数作用...

【回复】因为闭包的函数还持有外部函数的属性的访问。外部调用并执行完上一级函数,但是这个上一级的函数内部的属性不会被清空。会继续驻留在内存中。这是一个特性。可能也没什么因为所以。
girl_nex_door:
这是我看到的,唯一把闭包原理说清楚的视频。[支持][支持][支持][支持][支持]

今天也要努力向上学习:
python技巧 1·闭包现象 00:25 闭包现象 写了两个函数,可能会出现闭包现象 2·闭包函数 01:37 闭包函数 闭包是函数 一个可以访问别的...

为什么昵称只能用一次:
视频不错,把我多年没有搞懂的闭包讲得明明白白的了,很通俗易懂!是个收藏大于点赞的视频

SNH48-叶凡:
我;老师能讲下闭包吗 老师;我也不太清楚 ([无语]

Alpha-1-Fdshik:
我发现c++的结果和视频里的完全不一样,首先最外层函数执行完会销毁吗?我这里的结论有时候会有时候不会,不过自始至终都只有一个实例在运行。使用指针可以访问闭包吗?我的结论是行,直接解引用指针可以调用闭包,但是解引用赋值给原来的变量编译器会报错。每次声明也就是gx = f()这个操作都会重新初始化,闭包如果使用了指针则会重新创建对象并将g1和g2重定向到新的对象(不知道c++是如何做到重定向的)。g1和g2两个的地址是一样的,g1和g2控制的a也是同一个数据。并且我还发现了bug,vs2022编译32位a的结果是正常的换成64位就是一坨乱码,在声明g1后再声明一个类对象(必须往构造函数传参)然后a的内存会被回收(貌似原因是a变成了新对象this指针的值)。

编程 python技巧 python Python 闭包

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!