“闭包”和“lambda”有什么区别?

问题描述

只是一个匿名函数 - 一个没有名称定义的函数。在某些语言中,例如 Scheme,它们等价于命名函数。实际上,函数定义被重写为在内部将 lambda 绑定到变量。在其他语言中,例如 Python,它们之间存在一些(相当不必要的)区别,但它们的行为方式相同。

*

def func(): return h
def anotherfunc(h):
   return func()

这将导致错误,因为funcanotherfunc在-h未定义的环境中。func仅在全球环境中关闭。这将起作用:

def anotherfunc(h):
    def func(): return h
    return func()

因为在这里funcanotherfunc, 和 python 2.3 及更高版本(或类似的数字)中定义,当它们 几乎 得到正确的闭包时(突变仍然不起作用),这意味着它 anotherfunc‘s 环境并可以访问内部的变量它。在 Python 3.1+ 中,突变在使用关键字nonlocal也有效。

一个重要的一点 -func将继续关闭 overanotherfunc的环境,即使它不再在anotherfunc. 此代码也将起作用:

def anotherfunc(h):
    def func(): return h
    return func

print anotherfunc(10)()

这将打印 10。

s无关——它们是两个不同(尽管相关)的概念。

解决方法

有人可以解释一下吗?我了解它们背​​后的基本概念,但我经常看到它们可以互换使用,我感到困惑。

既然我们在这里,它们与常规函数有何不同?