时间:2021-05-22
python函数的闭包问题(内嵌函数)
>>> def func1():... print ('func1 running...')... def func2():... print ('func2 running...')... func2()... >>> func1()func1 running...func2 running...内部函数func2作用域都在外部函数func1作用域之内
如果试图在外部函数的外部调用内部函数将会报错
关于python的闭包问题
如果试图在一个内部函数里对外部作用域(不包括外部函数的外部作用域)的变量进行引用,内部函数就会被认为是闭包
>>> def FuncX(x):... def FuncY(y):... return x*y... return FuncY对于FuncY函数来说,对在FuncX函数的整个作用域(FuncY函数的非全局作用域的外部作用)的变量x进行引用,自此就可以说FuncY函数就是所谓的闭包
>>> f = FuncX(8)>>> f<function FuncY at 0x7f3a436fc2a8>>>> type(f)<type 'function'>>>> f(10)80>>> FuncX(7)(8)56由于闭包本身是基于内部函数这一概念而来,所以不能在外部函数的外部作用域对内部函数进行调用
>>> FuncY(8)Traceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'FuncY' is not defined既然是基于内部函数这一概念而来,自然对于内部函数来说对引用外部函数作用域内的变量进行修改,将会启动解释器的屏蔽机制
>>> def Func1():... x = 233... def Func2():... x *=x... return x... return Func2()... >>> Func1()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 6, in Func1 File "<stdin>", line 4, in Func2UnboundLocalError: local variable 'x' referenced before assignmentx*=x的左值此时是内部函数作用域里的变量,此时试图将没有定义的数据进行平方操作,因此报错
>>> def Func1():... x = 233... def Func2():... x = 321... return x... return Func2()... >>> Func1()321内部函数创建x变量并且屏蔽外部函数作用域内的x变量
python3之前的解决办法
应用容器类型(list,tuple之类的)存放外部函数作用域的变量从而不会被屏蔽机制屏蔽掉,因为容器类型不是存放在栈里面
>>> def Func1():... x = [233]... def Func2():... x[0] *= x[0]... return x[0]... return Func2()... >>> Func1()54289python3之后的解决办法:nonlocal关键字
>>> def Func1():... x = 233... def Func2():... nonlocal x... x *= x... return x... return Func2()... >>> Func1()54289以上所述是小编给大家介绍的python函数的闭包问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解Python中LEGB和闭包及装饰器LEGBL>E>G?BL:local函数内部作用域E:enclosing函数内部与内嵌函数之间G:global全
闭包定义在JavaScript中,当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。简单说,闭包就是能够读取其他函数内部变量的函数。闭包的作用:1.
一、闭包闭包从形式上来说是在外部函数中定义内部函数,并且内部函数引用了外部函数的变量,此变量叫做自由变量。或者说是将组成函数的语句和这些语句的执行环境打包在一起
简介闭包closure是javascript中一个非常强大的功能。所谓闭包就是函数中的函数,内部函数可以访问外部函数的作用域范围,从而可以使用闭包来做一些比较强
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。闭包有三个特性:1.函数嵌套函数2.函数内部可以引用外部