小编典典

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

all

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

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


阅读 117

收藏
2022-03-01

共1个答案

小编典典

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

闭包* 是在定义它的 环境中 关闭 的任何函数。这意味着它可以访问不在其参数列表中的变量。例子: *

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

这将导致错误,因为func关闭anotherfunc在-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。

正如您所注意到的,这与lambda s无关——它们是两个不同(尽管相关)的概念。

2022-03-01