我读了很多关于闭包的文章,我想我理解了它们,但在不给我自己和其他人蒙上阴影的情况下,我希望有人能尽可能简洁和清晰地解释闭包。我正在寻找一个简单的解释,可以帮助我理解我想要在哪里使用它们以及为什么要使用它们。
发布于 2008-08-17 19:32:33
它很简单:引用包含作用域中的变量的函数,可能是在控制流离开该作用域之后。最后一点非常有用:
>>> 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成为合适的闭包。
发布于 2008-08-23 07:43:18
老实说,我对闭包非常了解,除了我从来不清楚“闭包”到底是什么,以及它的“闭包”是什么。我建议你放弃寻找术语选择背后的任何逻辑。
无论如何,这是我的解释:
def foo():
x = 3
def bar():
print x
x = 5
return bar
bar = foo()
bar() # print 5
这里的一个关键思想是,从foo返回的函数对象保留到本地变量'x‘的钩子,即使'x’已经超出作用域,应该被废弃。这个钩子指向var本身,而不仅仅是var当时拥有的值,所以当调用bar时,它会输出5,而不是3。
还要清楚的是,Python2.x的闭包是有限的:我无法修改' bar‘中的'x’,因为写入'x = bla‘会在bar中声明一个本地'x’,而不是赋值给foo的'x‘。这是Python的assignment=declaration的副作用。为了解决这个问题,Python 3.0引入了非本地关键字:
def foo():
x = 3
def bar():
print x
def ack():
nonlocal x
x = 7
x = 5
return (bar, ack)
bar, ack = foo()
ack() # modify x of the call to foo
bar() # print 7
发布于 2008-08-17 20:20:20
我从来没有听说过在同样的上下文中使用事务来解释闭包是什么,并且这里真的没有任何事务语义。
它之所以称为闭包,是因为它“关闭”了外部变量(常量)--也就是说,它不仅是一个函数,而且是创建该函数的环境的一个封闭部分。
在下面的示例中,在更改x之后调用闭包g也会更改g中x的值,因为g在x上关闭:
x = 0
def f():
def g():
return x * 2
return g
closure = f()
print(closure()) # 0
x = 2
print(closure()) # 4
https://stackoverflow.com/questions/13857
复制相似问题