美文网首页Python
Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)

Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)

作者: 欢喜明 | 来源:发表于2018-03-27 17:31 被阅读0次

一、闭包:

记得:闭包的特性就是:内嵌函数会保存它引用的外围函数的变量值。

闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数和被引用的变量等就被认为是闭包。

闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体,所以严格来说,闭包不是等同于函数。

闭包是种技术实现,不应该说外围函数是闭包还是内嵌函数是闭包。

用一句话说明白闭包函数,那就是:函数内在包含子函数,并最终return子函数

而闭包函数的最大价值在于:我们可以在函数的外部(返回了内嵌函数),直接读取该函数的局部变量。

def  f1():

        n = 1

        def  f2():

                n = n +1

                return n

        return f2

res = f1()

print(res)   # 2

二、看下面的程序:

特别注意点:

1、“greeting”函数访问了非本地的变量”prefix”,根据对namespace的理解,这是完全可以的。

2、重点是:变量”prefix”并没有随着greeting_conf函数的退出而销毁,反而是生命周期得到了延长。

记录1:

在Python中,函数对象有一个__closure__属性;

['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

(<cell at 0x0000000000580B28: str object at 0x0000000000DA3230>,)

<class 'cell'>

Good Morning

greeting   # print(mGreeting.__name__)

通过__closure__属性看到,它对应了一个tuple,tuple的内部包含了cell类型的对象。可以得到cell的值为”Good Morning”,也就是变量”prefix”的值。

从这里可以看到闭包的原理,当内嵌函数引用了包含它的函数(enclosing function)中的变量后,这些变量会被保存在内嵌函数的__closure__属性中,成为内嵌函数本身的一部分。

记录2:

在Python中创建一个闭包可以归结为以下三点:

函数内嵌函数;

内嵌函数需要引用上一级namespace中的变量;

外围函数必须返回内嵌函数;

通过这三点,就可以创建一个闭包,Python装饰器就是使用了闭包。

相关文章

  • Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)

    一、闭包: 记得:闭包的特性就是:内嵌函数会保存它引用的外围函数的变量值。 闭包概念:在一个内部函数中,对外部作用...

  • 闭包和立即执行函数

    闭包闭包:内部的函数引用了外部的函数的变量,则产生闭包。闭包的作用:把变量封装在函数中,只有内部函数可以用,让函数...

  • python基础-08-内置函数、作用域、闭包、递归

    python基础-内置函数、作用域、闭包、递归 1.常见的内置函数 2.函数内变量的作用域 3.内嵌函数和闭包 4...

  • 「JS」闭包

    闭包闭包的应用保存变量现场封装 闭包 闭包有函数和与其相关的引用环境的组合而成 闭包允许函数访问其引用环境中的变量...

  • 2018-11-20

    python函数的闭包 闭包: 嵌套函数调用外部函数的变量 注意: 闭包必须是内部函数调用外部函数定义的变量,这其...

  • 面试题(day-2)

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,...

  • 闭包

    闭包概念 在计算机科学中,闭包, 又称词法闭包或函数闭包, 是引用了自由变量的函数。 这个被引用的自由变量将和这个...

  • 变量

    闭包: 什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾机构回收; 用闭包做...

  • 变量和函数、闭包

    闭包: 什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾机构回收; 用闭包存...

  • 13_day变量和函数、闭包

    闭包: 什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾机构回收; 用闭包做...

网友评论

    本文标题:Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)

    本文链接:https://www.haomeiwen.com/subject/dojscftx.html