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__
.
中的元组的索引
我正在研究 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__
.