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函数的闭包问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

python闭包详解函数_详解python函数的闭包问题(内部函数与外部函数详述)相关推荐

  1. c 语言 内部函数与外部函数,C语言-内部函数与外部函数.doc

    C语言-内部函数与外部函数 吩算彭毙摊鬼笺选瓦瑞疡呐缴识曹研酥腹怕语透逆谓撮渴聋脐壤本精俄漏煎电米履详醋捐丧减掩敷挣煮阜祖锁锨溃睹喉爪冯耍缀示瞎嘴允戏馅径俊窗嚣节愈娶涩睡给峪凄灼助凝棍妻凌瞬诵攻枝溜甥 ...

  2. keil 函数 默认 外部 内部 博客_5.9 C++内部函数与外部函数

    点击上方"C语言入门到精通",选择置顶 第一时间关注程序猿身边的故事 作者 闫小林 白天搬砖,晚上做梦.我有故事,你有酒么? C++内部函数在C++中,根据函数能否被其他源文件调用 ...

  3. 黑马程序员--C语言基础之--变量、内部函数与外部函数

    ------IOS培训期待与您交流! ------- 一.变量 变量代表着一个有名字的.具有特定属性的一个存储单元,运行期间,变量的值是可以改变的.变量必须先定义,后使用.定义时,指定该变量的名字与类 ...

  4. C语言的内部函数与外部函数

    内部函数与外部函数 在C语言中不能被其他源文件调用的函数称谓内部函数 ,内部函数由static关键字来定义,因此又被称谓静态函数,形式为: static [数据类型] 函数名([参数]) 这里的sta ...

  5. C语言 内部函数和外部函数

    C语言学习 内部函数和外部函数 内部函数 外部函数 总结 内部函数和外部函数 函数本质是全局的,因为定义一个函数的目的就是要被另外的函数调用.若不回声明,一个文件中的函数既可以被本文件中其他函数调用, ...

  6. C语言内部函数与外部函数

    内部函数与外部函数的区分标准是,该函数能否被其他源文件调用. 内部函数 如果一个函数只能被本文件中的其他函数调用,称为内部函数.在定义内部函数的时候,在函数名和函数类型的前面加static,即: st ...

  7. C语言中全局变量和局部变量,内部函数和外部函数的区别

    1.局部变量和全局变量 1.局部变量:即在函数代码块中内部定义的变量名,只在此函数范围内有效.(只在子程序内定义和作用) 在c语言中,局部变量可以和全局变量重名,但是局部变量会覆盖全局变量,从而在引用 ...

  8. python while函数_详解python while 函数及while和for的区别

    1.while循环(只有在条件表达式成立的时候才会进入while循环) while 条件表达式: pass while 条件表达式: pass else: pass 不知道循环次数,但确定循环条件的时 ...

  9. python中延时函数_详解python中实现延时回调普通函数

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...

最新文章

  1. 工业4.0进行时:未来协作方式的变革
  2. 技术分享:逆向分析ATM分离器
  3. 最强Transformer发布!谷歌大脑提出ViT-G:缩放视觉Transformer,高达90.45%准确率!
  4. 设计模式之四-Factory模式
  5. 80C51单片机的最小系统
  6. 发布CodeBuild.Net代码自动生成器 V2008 2.01(Vs2008)和架构实例源码Demo
  7. 软件包管理器(树链剖分)
  8. 无限踩坑系列(7)-Latex使用Tips
  9. HDU 4619 Warm up 2 (多校)
  10. 计算机主板用塑料做的好吗,电脑主板包装的塑料袋为什么是用透明胶封的,这样...-卓优商学问答...
  11. java报错 csrf_spring security配置(.antMatchers(/).permitAll())后,页面CSRF均报错
  12. 10张架构图包含Python所有方向的学习路线,你们要的体系全在这
  13. git remote传到远程
  14. lintcode,翻转二叉树
  15. ignite mysql 持久化_2 ignite关键特性
  16. Base64自定义编码表及破解
  17. 纯真IP库详解(转)
  18. px4初探-qgroundcontrol安装
  19. 【中级计量经济学】Lecture 5 自相关
  20. 英飞凌TC387复位后无法跳转到应用程序首地址

热门文章

  1. java迭代器逆序_迭代器
  2. struct和typedef struct区别
  3. 程序员,你还在 Select * 吗?
  4. 事务的四大特性和隔离级别
  5. [转]版本二写代码的小女孩
  6. python3一个简单的网页抓取
  7. Android中Activity启动模式
  8. .net 页面框架的层次问题,嵌套问题
  9. C++ const限定符和auto类型说明符
  10. python获取目录树_Python读取文件目录树——os.walk