你能解释关闭(因为它们与Python有关)吗?

我一直在阅读很多关于关闭的内容,我想我理解他们,但是没有让我自己和其他人蒙混过关,我希望有人能够尽可能简洁清楚地解释关闭。 我正在寻找一个简单的解释,可以帮助我了解我想要使用它们的位置和原因。


关闭关闭

对象是附带方法的数据,闭包是附带数据的函数。

def make_counter():
    i = 0
    def counter(): # counter() is a closure
        nonlocal i
        i += 1
        return i
    return counter

c1 = make_counter()
c2 = make_counter()

print (c1(), c1(), c2(), c2())
# -> 1 2 1 2

很简单:引用来自包含范围的变量的函数,可能在控制流程已经离开该范围之后。 最后一点非常有用:

>>> def makeConstantAdder(x):
...     constant = x
...     def adder(y):
...         return y + constant
...     return adder
... 
>>> f = makeConstantAdder(12)
>>> f(3)
15
>>> g = makeConstantAdder(4)
>>> g(3)
7

请注意,12和4分别在f和g内部“消失”,这个特征使f和g正确关闭。


我喜欢这个粗略的,简洁的定义:

一个可以引用不再活动的环境的函数。

我会补充

闭包允许您将变量绑定到函数中,而不用将它们作为参数传递。

接受参数的装饰器是闭包的常见用法。 闭包是这种“功能工厂”的常见实现机制。 当战略在运行时被数据修改时,我经常选择在战略模式中使用闭包。

在一种允许匿名块定义的语言中,例如Ruby,C#闭包可以用来实现新的控制结构。 缺乏匿名块是Python中闭包的限制之一。

链接地址: http://www.djcxy.com/p/1449.html

上一篇: Can you explain closures (as they relate to Python)?

下一篇: What are 'closures' in .NET?