首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >你能解释一下闭包(因为它们与Python相关)吗?

你能解释一下闭包(因为它们与Python相关)吗?
EN

Stack Overflow用户
提问于 2008-08-17 19:14:31
回答 8查看 15.1K关注 0票数 94

我读了很多关于闭包的文章,我想我理解了它们,但在不给我自己和其他人蒙上阴影的情况下,我希望有人能尽可能简洁和清晰地解释闭包。我正在寻找一个简单的解释,可以帮助我理解我想要在哪里使用它们以及为什么要使用它们。

EN

回答 8

Stack Overflow用户

发布于 2008-08-17 19:32:33

它很简单:引用包含作用域中的变量的函数,可能是在控制流离开该作用域之后。最后一点非常有用:

代码语言:javascript
复制
>>> 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成为合适的闭包。

票数 46
EN

Stack Overflow用户

发布于 2008-08-23 07:43:18

老实说,我对闭包非常了解,除了我从来不清楚“闭包”到底是什么,以及它的“闭包”是什么。我建议你放弃寻找术语选择背后的任何逻辑。

无论如何,这是我的解释:

代码语言:javascript
复制
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引入了非本地关键字:

代码语言:javascript
复制
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
票数 17
EN

Stack Overflow用户

发布于 2008-08-17 20:20:20

我从来没有听说过在同样的上下文中使用事务来解释闭包是什么,并且这里真的没有任何事务语义。

它之所以称为闭包,是因为它“关闭”了外部变量(常量)--也就是说,它不仅是一个函数,而且是创建该函数的环境的一个封闭部分。

在下面的示例中,在更改x之后调用闭包g也会更改g中x的值,因为g在x上关闭:

代码语言:javascript
复制
x = 0

def f():
    def g(): 
        return x * 2
    return g


closure = f()
print(closure()) # 0
x = 2
print(closure()) # 4
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档