闭包 python_python | 闭包

python | 闭包

基础

作用域

作用域是程序运行时变量可被访问的范围,定义在函数内的变量是局部变量,局部变量的作用范围只能是函数内部范围内,它不能在函数外引用。

定义在模块最外层的变量是全局变量,它是全局范围内可见的,当然在函数里面也可以读取到全局变量的。例如:

num = 10 # 全局变量

def foo():

print(num) # 10

而在函数外部则不可以访问局部变量。

def foo():

num = 10

print(num) # NameError: name 'num' is not defined

嵌套函数

定义在函数里面的函数称之为嵌套函数(nested function)

def outer(): # outer是外层函数

msg = "python"

def inner(): # inner 为内层函数即嵌套函数

print(msg)

return inner()

outer() # 输出 python

对于嵌套函数,它可以访问到其外层作用域中声明的非局部(non-local)变量。首先查找本层函数 inner 内部是否有定义,没有发现后开始查找外层作用域的变量

msg = "global"

def outer(): # outer是外层函数

# msg = "python"

def inner(): # inner 为内层函数即嵌套函数

print(msg)

return inner()

outer()

而当把 outer函数的变量注释后,在全局进行定义,此时就开始查找全局变量

python 中函数是可以作为变量进行引用的,类似高中数学中的 f(x)计算

在高中数学复合函数定义中:

y=f(u), u=g(x),则函数 y=f(g(x))为复合函数,f(u)为外层函数,g(x)为内层函数,u为中间变量

计算顺序应当是先计算内层函数然后结果作为变量来计算外层函数

闭包

def outer(): # outer是外层函数

msg = "python"

def inner(): # inner 为内层函数即嵌套函数

print(msg)

return inner # 返回 inner 的地址

result = outer()

result() # 输出 python

print(outer()) # 输出 inner的内存地址

print(outer()()) # 输出 python和 None

print(result.func_closure)

结果

python

.inner at 0x103136ea0>

python

None

闭包使得局部变量在函数外被访问成为可能。 return 的函数不加括号返回的是地址。func_closure打印了闭包中包含了哪些外部变量。

1559610444927.png

每个函数都有__closure__属性,如果一个函数是闭包的话则会返回一个由 cell 对象组成的元组对象。而 cell 对象的cell_contents属性就是闭包中保存的自由变量

def adder(x):

def wrapper(y):

return x + y

return wrapper # 返回函数地址

adder5 = adder(5)

adder5(10) # 输出 10

adder5(6) # 输出 11

print(adder.__closure__)

print(adder5.__closure__)

print(adder5.__closure__[0].cell_contents)

结果

None

(,)

5 # 自由变量

闭包特点

一个函数返回的函数对象,这个函数对象执行的话依赖非函数内部的变量值,这个时候,函数返回的实际内容如下:

函数对象

函数对象需要使用的外部变量和变量值

以上就是闭包

闭包必须嵌套在一个函数里,必须返回一个调用外部变量的函数对象,才是闭包

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值