python lambda 'bound variable' 如何处理返回的函数值,而该值又作为另一个参数传递?

How does a python lambda 'bound variable' work with a returned function value which is in turn passed as another argument?

我正在研究 lambda 函数,我遇到了这个代码示例:

def myfunc(n):
    return lambda a : a * n

tripler = myfunc(3)
print(tripler(10)) # Output: 30

我了解到,当从 myfunc 函数中将 triple 赋给 return 值时,值 3 作为参数传递,并从函数内部表示为 'n'。但是 lambda 使用标记为 'a' 的绑定变量。所以在这一点上,忽略最后的打印行,我不确定 'a' 是如何被考虑在内的。当我 运行 此代码时,我没有收到任何错误。

我有兴趣了解这段代码是如何处理的,以及它是如何在不产生错误的情况下得出结论的。

myfunc 的 return 值是一个 闭包 ,它保留对传递给 myfunc 的参数的引用。

>>> x = myfunc(3)
>>> x.__closure__[0].cell_contents
3

当您调用 x 时,将使用该值。

>>> x(10)  # (lambda a: a * n)(10), with n == 3
30

您可以在为 x 生成的字节码中看到这一点:

>>> import dis
>>> dis.dis(x)
  2           0 LOAD_FAST                0 (a)
              2 LOAD_DEREF               0 (n)
              4 BINARY_MULTIPLY
              6 RETURN_VALUE

LOAD_FAST 引用局部变量(在这种情况下,唯一的局部变量是参数 a),而 LOAD_DEREF 引用闭包。参数 0 是存储在 x.__closure__.

中的元组的索引