我刚刚在Python中学习Lambda函数,并对这里发生的事情感到困惑。
z = 3
e = lambda x: lambda y: lambda: x + y + z
e(0)(1)()
"returns 4"
f = lambda z: x + z
f(3)
"returns ?"
我有点理解第一个lambda链在正常def语句和每个def语句之外重写了它,返回刚刚定义的函数...
def i(x):
def j(y):
def k(z):
return x + y + z
return k(z)
return j(y)
但我不确定f = lambda z:x + z是如何在这里工作的
感谢您的帮助!
答案 0 :(得分:0)
你对第一批lambdas的翻译并不完全正确。它应该是:
def i(x):
def j(y):
def k(): # no z argument
return x + y + z
return k # return the function k, without calling it
return j # same here, just return j without calling it
当您使用i(0)(1)()
调用它时,此功能正常。在内部函数x
和y
中查找包含的范围(查找0
和1
),z
被查找为全局变量
你的第二个lambda相当于:
def g(z):
return x + z
这不起作用,因为x
未定义为全局。如果您将z
参数重命名为x
,那么它将起作用,因为返回的总和中的z
将是前一代码使用的全局z
和{{ 1}}将是争论。如果lambda适合您,您必须定义一个x
全局,但您尚未在代码段中显示。