Python 语法之闭包
admin
2023-02-15 04:00:07
0

  闭包的概念

  在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

  在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。

  函数名称的引用传递

  def func():

  print("--- func is run ----")

  func()

  ret = func

  print(id(ret))

  print(id(func))

  ret()

  运行结果:

  --- func is run ----

  56145576

  56145576

  --- func is run ----

  由上图可知,和变量名一样的,函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候就是引用传递。

  局部-全局变量

  定义在方法内的变量是局部变量,不能在方法外做引用;定义在模块最外层的变量是全局变量,它是全局范围内可见的。

  那么问题来了,当方法内部有嵌套方法时,嵌套方法能否使用父方法中定义的局部变量呢?答案是可以。

  def outer_func():

  data = 520

  def inner_func():

  return data

  return inner_func()

  print(outer_func())

  运行结果:

  520

  此时调用 outer_func() 函数的返回值就是 520,所以说嵌套方法可以使用父方法中声明的局部变量。

  闭包的写法

  上面的概念还算比较容易理解,那么什么是闭包呢?我们来看下面一段代码:

  def outer_func():

  data = 520

  def inner_func():

  return data

  return inner_func

  print(outer_func())

  result = outer_func()

  print(result())

  运行结果:

  .inner_func at 0x02D8B6A8>

  520

  闭包的执行流程图

  执行第 11 行代码:

  先执行 print() 函数中的 outer_funcf() 函数,并将内层函数 inner_func() 函数的内存地址进行返回,最终 print() 函数将 return 返回的内层函数地址进行打印输出。

  执行第 13 行代码: 郑州看妇科的医院 http://www.ytsgfk120.com/

  先执行等号右侧的 outer_func () 函数,最终返回 inner_func() 函数的地址引用。等号左侧 result 变量进行接收内层函数地址。

  执行第 15 行代码:

  先执行 print() 函数中 result() 函数,因为 result 变量保存了内层函数 inner_func() 函数的地址,所以 result 变量后面加上括号就相当于执行 inner_func() 函数。执行内层函数并且将 data 值返回,最终使用 print() 函数将返回值打印输出。

  修改外部函数中的变量

  nonlocal 关键字用来在函数或其他作用域中使用外层的(非全局)变量,修饰变量后表示该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal 位置会发生错误(最上层的函数使用 nonlocal 修饰变量必定会报错)。

  data = 20

  def outer_func():

  data = 0

  def inner_func():

  nonlocal data

  data = 666

  print("--- inner_func ---:",data)

  inner_func()

  print("--- outer_func ---:",data)

  outer_func()

  print("--- 函数外 ---:",data)

  运行结果:

  --- inner_func ---: 666

  --- outer_func ---: 666

  --- 函数外 ---: 20

  总结

  函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候就是引用传递

  定义在方法内的变量是局部变量,不能在方法外做引用,但是可以被内层函数引用。

  闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递给函数外的对象

  内部函数和使用的外部函数提供的变量构成的整体称为闭包。


相关内容

热门资讯

身高缩了,房子小了,胆子也怯了... 据日经中文网7月24日报道,日本经济长期停滞催生了“不断缩小”的社会倾向,近年来日本人的平均身高持续...
广东省内铁路即将全线停运 作者 | 第一财经 南英今年第12号台风“红霞”已于7月24日凌晨生成,预计25日夜间至26日早晨在...
中美频繁高层互动,菲律宾好自为... 7月24日,菲律宾组织7艘公务船、3艘海警舰、1艘运鱼船,并唆使大量渔船位中国黄岩岛管辖海域非法聚集...
被要求补税2250万欧元的法国... ·贝尔纳·阿尔诺。(LVMH官网)他的“帝国”离不开这个国家的形象加持,而这个国家,也早已吃定了这一...
通派龙湖御潮云上:当极核地段遇... 在2026年的郑州楼市版图中,如果要寻找一个能够同时承载“主城确定性”与“产品革新力”的坐标,通派龙...
追光引路人—记国家级线上线下混... 人物名片:吴建丽,教授,黄河科技学院医学部教师。主持国家级线上线下混合式一流课程1门、河南省线上线下...
加总理表态:若谈判破裂,会对美... 据凤凰卫视报道,7月23日,加拿大总理卡尼与各省省长和地区领导人举行会议,商讨应对美国最新一轮关税威...
从北京望中东:和平,虽远在中国... ◆笔者参与的分论坛“维护中东和平:挑战与出路”正在进行中。今年7月举行的第十四届世界和平论坛上,中东...
巨大冲击!美国AI“闭源高价售... 日本计算机社会学专家塚越健司7月24日发表题为《中国AI“Kimi K3”引发巨大冲击——撼动美国A...
人民锐评:中国籍数学家首获全球... 历史性的突破!日前,第二十一届菲尔兹奖得主名单揭晓,北大2007级本科校友王虹、邓煜双双获奖,无数网...