python内部函数和比外部函数快_详解python函数的闭包问题(内部函数与外部函数详述)...

python函数的闭包问题(内嵌函数)

>>> def func1():

... print ('func1 running...')

... def func2():

... print ('func2 running...')

... func2()

...

>>> func1()

func1 running...

func2 running...

内部函数func2作用域都在外部函数func1作用域之内

如果试图在外部函数的外部调用内部函数将会报错

>>> func2()

Traceback (most recent call last):

File "", line 1, in

NameError: name 'func2' is not defined

关于python的闭包问题

如果试图在一个内部函数里对外部作用域(不包括外部函数的外部作用域)的变量进行引用,内部函数就会被认为是闭包

>>> def FuncX(x):

... def FuncY(y):

... return x*y

... return FuncY

对于FuncY函数来说,对在FuncX函数的整个作用域(FuncY函数的非全局作用域的外部作用)的变量x进行引用,自此就可以说FuncY函数就是所谓的闭包

>>> f = FuncX(8)

>>> f

>>> type(f)

>>> f(10)

80

>>> FuncX(7)(8)

56

由于闭包本身是基于内部函数这一概念而来,所以不能在外部函数的外部作用域对内部函数进行调用

>>> FuncY(8)

Traceback (most recent call last):

File "", line 1, in

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 "", line 1, in

File "", line 6, in Func1

File "", line 4, in Func2

UnboundLocalError: local variable 'x' referenced before assignment

x*=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()

54289

python3之后的解决办法:nonlocal关键字

>>> def Func1():

... x = 233

... def Func2():

... nonlocal x

... x *= x

... return x

... return Func2()

...

>>> Func1()

54289

以上所述是小编给大家介绍的python函数的闭包问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对聚米学院网站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值