The question has already been answered by aaronasterling
但是,有人可能会对变量如何存储在引擎盖下感兴趣 .
Before coming to the snippet:
闭包是从其封闭环境继承变量的函数 . 当你将函数回调作为参数传递给另一个将执行I / O的函数时,这个回调函数将在稍后调用,并且这个函数将 - 几乎神奇地 - 记住声明它的上下文,以及所有可用的变量在这种情况下 .
如果函数不使用自由变量,则它不会形成闭包 .
如果有另一个内部级别使用自由变量 - 所有以前的级别都保存词法环境(最后的例子)
函数属性 func_closure in python < 3.X or closure in python > 3.X save the free variables.
python中的每个函数都有这个闭包属性,但如果没有自由变量,它不会保存任何内容 .
example: of closure attributes but no content inside as there is no free variable.
>>> def foo():
... def fii():
... pass
... return fii
...
>>> f = foo()
>>> f.func_closure
>>> 'func_closure' in dir(f)
True
>>>
NB: FREE VARIABLE IS MUST TO CREATE A CLOSURE.
我将解释使用与上面相同的代码段:
>>> def make_printer(msg):
... def printer():
... print msg
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer() #Output: Foo!
并且所有Python函数都有一个闭包属性,所以让我们检查与闭包函数关联的封闭变量 .
这是函数 func_closure 的属性 func_closure
>>> 'func_closure' in dir(printer)
True
>>> printer.func_closure
(,)
>>>
closure 属性返回一个单元格对象元组,其中包含封闭范围中定义的变量的详细信息 .
func_closure中的第一个元素可以是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
>>>
在上面的代码片段中,我不打印打印机功能内的msg,因此它不会创建任何自由变量 . 由于没有自由变量,闭包内部将没有内容 . 这正是我们上面看到的 .
现在我将解释另一个不同的片段,以清除所有 Free Variable 与 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')
因此,我们看到 func_closure 属性是闭包单元格的元组,我们可以明确地引用它们及其内容 - 单元格具有属性"cell_contents"
>>> inn.func_closure
(,
,
)
>>> for i in inn.func_closure:
... print i.cell_contents
...
free
am
I
>>>
这里当我们调用 inn 时,它会引用所有保存自由变量,所以我们得到 I am free variable
>>> inn('variable')
'I am free variable'
>>>
最后
以上就是畅快香菇最近收集整理的关于python函数嵌套闭包_为什么不将python嵌套函数称为闭包?的全部内容,更多相关python函数嵌套闭包_为什么不将python嵌套函数称为闭包内容请搜索靠谱客的其他文章。
发表评论 取消回复