Python闭包及其作用域

关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记

如果在一个内部函数里,对一个外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被称为闭包(closure),而这个被内部函数引用的变量则被成为自由变量

闭包和函数调用没多少相关,而是关于使用定义在其他作用域的变量

命名空间和作用域

我们把命名空间看做一个大型的字典类型(Dict),里面包含了所有变量的名字和值的映射关系。在 Python 中,作用域实际上可以看做是“在当前上下文的位置,获取命名空间变量的规则”。在 Python 代码执行的任意位置,都至少存在三层嵌套的作用域:

最内层作用域,最先搜索,包含所有局部变量(Python 默认所有变量声明均为局部变量)

所有包含当前上下文的外层函数的作用域,由内而外依次搜索,这里包含的是非局部也非全局的变量

一直向上搜索,直到当前模块的全局变量

最外层,最后搜索的,内置(built-in)变量

scopes = {

"local": {"locals": None,

"non-local": {"locals": None,

"global": {"locals": None,

"built-in": ["built-ins"]}}},

}

除了默认的局部变量声明方式,Python还有global和nonlocal两种类型的声明(nonlocal是Python3.x之后才有的),其中nonlocal是指最内层之外,global以内的变量。必须强调的是,最内层局部作用域对外层作用域的变量只有只读(read-only)的访问权限。比如下列的例子

x = 100

def main():

x += 1

print (x)

main()

---------------------------------------------------------------------------

UnboundLocalError Traceback (most recent call last)

in ()

3 x += 1

4 print(x)

----> 5 main()

in main()

1 x = 100

2 def main():

----> 3 x += 1

4 print(x)

5 main()

UnboundLocalError: local variable 'x' referenced before assignment

这里抛出UnboundLocalError,是因为main()函数内部的作用域对于全局变量x仅有只读权限,想要在main()中对x进行改变,不会影响全局变量,而是会创建一个新的局部变量,显然无法对还未创建的局部变量直接使用x += 1, 因为x未绑定到任何对象上。如果想要获得全局变量的完全引用,则需要global声明:

x = 100

def main():

global x

x += 1

print(x)

main()

print(x) # 全局变量已被改变

# result:

# 101

# 101

闭包

闭包和函数调用没多少相关,而是关于使用定义在其他作用域的变量。

看了上面的Python作用域规则后,我们可以仿照JavaScript写一个计数器的闭包:

"""

/* JavaScript Closure example */

var inc = function(){

var x = 0;

return function(){

console.log(x++);

};

};

var inc1 = inc()

var inc2 = inc()

"""

# Python

def inc():

x = 0

def inner():

nonlocal x

x += 1

print(x)

return inner

inc1 = inc()

inc2 = inc()

inc1()

inc1()

inc1()

inc2()

# result:

# 1

# 2

# 3

# 1

在这里,全局环境下不能获取到inc()中的局部变量x的,但是我们返回了inc()内部函数inner(),而inner()对inc()中的局部变量是有访问权限的。也就是说inner()将inc()局部作用域打包发送给了inc1和 inc2,从而使他们各自独立拥有了一块封闭起来的作用域,不受其他运行环境和全局变量的影响,因此称之为闭包。

上述代码中inc1和inc2各自有一块封闭起来的作用域,可以通过Online Python Tutor 可视化运行工具看相应的运行结果

python中闭包的作用_Python闭包及其作用域相关推荐

  1. python中get函数作用_python get函数有什么作用?示例解析

    这篇文章之中我们来了解一下关于python字典之中的pythonget函数的相关知识,get函数是什么意思,他有什么作用都将会在接下来的文章之中得到解答. 描述 Python 字典(Dictionar ...

  2. python中import的作用_python使用import报错是什么原因

    在练习Python中package的相对导入时,即from . import XXX 或者from .. import XXX 有时会遇到这样两个错误:SystemError: Parent modu ...

  3. python中注释的作用_python注释是什么意思

    注释即对程序代码的解释,在写程序时需适当使用注释,以方便自己和他人理解程序各部分的作用.在执行时,它会被Python解释器忽略,因此不会影响程序的执行. Python支持单行注释与多行注释,具体如下所 ...

  4. python中赋值语句的作用_python中return可以使用赋值语句吗?

    在python中,有各种不同类型的语句.一个python程序是由模块构成的;一个模块由一条或多条语句组成;每个语句由不同的表达式组成;表达式可以创建和操作对象.下面来看看python中的语句. 赋值语 ...

  5. python中count的作用_python中函数COUNT()的功能是什么

    python中函数COUNT()的功能是统计字符串里某个字符出现的次数,语法为[str.count("char", start,end)],其中str为要统计的字符,star为索引 ...

  6. python中注释的作用_Python函数添加注释的好处

    前面的教程中,我们已经学习了 Python 中的注释方式,单行注释以#开头,进行多行注释时通常用三个单引号'''将注释部分包裹起来. 在函数的定义中,常利用多行注释给函数写文档,称为函数文档.为什么要 ...

  7. python中format函数作用_python中format函数什么意思

    python中format函数什么意思? Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % ...

  8. python中count的作用_python count函数用法详解

    在python中可以使用"count()"函数统计字符串里某个字符出现的次数,该函数用于统计次数,其语法是"count(sub, start= 0,end=len(str ...

  9. python中注释的作用_Python 注释作用写法及示例代码

    1、代码注释的作用 1) 注释可用于解释Python代码. 2) 注释可用于使代码更具可读性. 3) 注释可用于在测试代码时阻止执行. 2、单行注释 注释以开头#,Python将忽略它们: 例如,#T ...

最新文章

  1. Echarts报错:Component series.lines not exists. Load it first.
  2. UE4 HTC VIVE 多人联机
  3. C++结构体中const使用场景
  4. 【VS Code配置matlab】手把手教学,matlab也能自动补全+瞬间启动+代码整理!
  5. Java中的自动拆箱装箱(AutoboxingUnboxing)
  6. tcpdf html 格式重叠,使用TCPDF进行HTML呈现(PHP)
  7. [转] 虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理
  8. CentOS8下vi编辑器常用命令
  9. centos安装7zip
  10. 微信公众号 被关注回复和关键词回复
  11. ubuntu16.04安装完后无法上网
  12. 马尔科夫链原理简介及应用
  13. MySQL--基础知识点--64--等值连接/自连接/自然连接/外连接
  14. 中国式SaaS技术架构
  15. PriceFromImage\UnCodebase
  16. 2022年第3周(1月10日-1月16日)中国各影院电影票房排行榜:榜首票房83万元,8家影院观影人次超过万人(附年榜TOP100详单)
  17. BSCI—8-(1):OSPF的特殊区域类型与配置(末节与完全末节区域)
  18. 版本迭代数据库结构更新sql
  19. ReactJS 傻瓜教程
  20. oracle 10g sga_target,Oracle 10g 中sga_max_size 和sga_target用法

热门文章

  1. matlab中电感元件,中性点经消弧线圈及其并电阻接地系统的MATLAB仿真
  2. jdbc链接mysql按照id查询_使用jdbc连接并操作Oracle数据库(增删改查IDUS)
  3. css无效 https_【CSS非全解02】CSS基础-文档流
  4. linux mkdir 系统调用,Linux Rootkit 系列四:对于系统调用挂钩方法的补充
  5. python保存变量_Python变量存储
  6. html页面跨域提交数据,前端跨域的整理
  7. oracle ebs wsh picking batch,ebs 11i 订单相关表结构学习及销售到出仓所经历的表
  8. python四种可变类型_Python的可变类型与不可变类型
  9. tcxgrid主从结构显示多行_快速跟随型主从结构多电机同步控制
  10. java堆内存_java堆内存详解