你能解释一下闭包在Python中的作用吗?

101

我一直在阅读与闭包相关的文章,我认为我理解了它们,但是为了不让自己和别人感到困惑,我希望有人能够简洁明了地解释一下闭包。我正在寻找一个简单的解释,可能有助于理解何时何地以及为什么要使用它们。

我已经看了很多关于闭包的资料,对此有了一定的了解,但为了避免混淆自己和他人,我希望有人可以尽可能简明地解释一下闭包。我希望得到一个简单的解释,帮助我理解何时何地以及为什么使用它们。

13个回答

1
这是 Python3 闭包的一个例子。
def closure(x):
    def counter():
        nonlocal x
        x += 1
        return x
    return counter;

counter1 = closure(100);
counter2 = closure(200);

print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 2 " + str(counter2()))
print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 2 " + str(counter2()))

# result

i from closure 1 101
i from closure 1 102
i from closure 2 201
i from closure 1 103
i from closure 1 104
i from closure 1 105
i from closure 2 202

0
对我来说,“闭包”是能够记住它们被创建时的环境的函数。这种功能允许您在闭包中使用变量或方法,否则您将无法使用它们,因为它们已经不存在或者超出了范围。让我们看一下 Ruby 中的代码:
def makefunction (x)
  def multiply (a,b)
    puts a*b
  end
  return lambda {|n| multiply(n,x)} # => returning a closure
end

func = makefunction(2) # => we capture the closure
func.call(6)    # => Result equal "12"  

即使"multiply"方法和"x"变量不再存在,它仍然可以工作。这是因为闭包具有记忆能力。


-2

我曾经看到的最好的闭包解释是解释机制。 大概是这样的:

将程序堆栈想象成一个退化的树,其中每个节点只有一个子节点,而单个叶节点是当前正在执行的过程的上下文。

现在放松每个节点只能有一个子节点的限制。

如果这样做,您可以拥有一个构造(“yield”),它可以从过程返回而不丢弃本地上下文(即在返回时不会将其弹出堆栈)。 下次调用该过程时,调用会接收旧的堆栈(树)帧,并继续执行离开的地方。


这不是闭包的解释。 - Jules
你正在描述continuations,而不是closures。 - Matthew Olenik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接