概述
然而,有些人可能对变量如何存储在引擎盖下感兴趣。
在进入片段之前:
闭包是从其封闭环境继承变量的函数。当您将函数回调作为参数传递给另一个执行I/O操作的函数时,稍后将调用此回调函数,并且此函数将几乎神奇地记住声明它的上下文以及该上下文中可用的所有变量。如果函数不使用自由变量,它就不会形成闭包。
如果有另一个内部级别使用自由变量--allprevious levels保存词汇环境(例如在末尾)
python中的函数属性func_closure<;3.X或python中的__closure__>;3.X保存可用变量。
python中的每个函数都有这个闭包属性,但是如果没有自由变量,它不会保存任何内容。
示例:闭包属性,但内部没有内容,因为没有自由变量。>>> def foo():
... def fii():
... pass
... return fii
...
>>> f = foo()
>>> f.func_closure
>>> 'func_closure' in dir(f)
True
>>>
我将使用与上面相同的片段进行解释:>>> def make_printer(msg):
... def printer():
... print msg
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer() #Output: Foo!
所有Python函数都有一个closure属性,因此让我们检查与closure函数相关联的封闭变量。
这是函数的属性func_closure>>> 'func_closure' in dir(printer)
True
>>> printer.func_closure
(,)
>>>
closure属性返回单元格对象的元组,该元组包含在封闭作用域中定义的变量的详细信息。
func_闭包中的第一个元素,它可以是None,也可以是包含函数自由变量绑定的元组,并且是只读的。>>> dir(printer.func_closure[0])
['__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']
>>>
在上面的输出中,您可以看到cell_contents,让我们看看它存储了什么:>>> printer.func_closure[0].cell_contents
'Foo!'
>>> type(printer.func_closure[0].cell_contents)
>>>
所以,当我们调用函数printer()时,它访问存储在cell_contents中的值。这就是为什么我们得到的输出是“Foo!”
我将再次解释使用上述代码片段的一些更改:>>> def make_printer(msg):
... def printer():
... pass
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer.func_closure
>>>
在上面的代码片段中,我不在printer函数中打印msg,因此它不创建任何自由变量。由于没有自由变量,因此闭包内将没有内容。这正是我们上面看到的。
现在,我将解释另一个不同的片段,用Closure清除所有内容:>>> def outer(x):
... def intermediate(y):
... free = 'free'
... def inner(z):
... return '%s %s %s %s' % (x, y, free, z)
... return inner
... return intermediate
...
>>> outer('I')('am')('variable')
'I am free variable'
>>>
>>> inter = outer('I')
>>> inter.func_closure
(,)
>>> inter.func_closure[0].cell_contents
'I'
>>> inn = inter('am')
因此,我们看到afunc_closure属性是闭包cells的元组,我们可以显式地引用它们及其内容——一个cell有“cellu contents”属性>>> inn.func_closure
(,
,
)
>>> for i in inn.func_closure:
... print i.cell_contents
...
free
am
I
>>>
在这里,当我们调用inn时,它将引用所有的save free变量,因此我们得到I am free variable>>> inn('variable')
'I am free variable'
>>>
最后
以上就是谨慎皮皮虾为你收集整理的python函数嵌套闭包_为什么python嵌套函数不称为闭包?的全部内容,希望文章能够帮你解决python函数嵌套闭包_为什么python嵌套函数不称为闭包?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复