Lambda表达式:Lambda内部对lambda的引用

时间:2018-07-20 07:28:41

标签: python lambda

我很难理解这个表达式,尤其是为什么在定义lambda时不会抛出错误,因为lambda引用本身只是在声明。有趣的是,它也以递归方式工作。我希望L未定义错误。这可能是因为隐式变量吊起吗? (python将变量声明移至当前作用域的顶部/开始)

#why doesn't this throw an error
L = lambda: print(L)

#recursive example...
L = lambda: L()

1 个答案:

答案 0 :(得分:0)

#why doesn't this throw an error
L = lambda: print(L)

在这里,您仅定义一个匿名函数并将其地址存储在L中,而不在此处执行逻辑。 您可以将lambda函数分配给变量以为其命名。正是您在上述代码中所做的

>>> lambda: print(x) <function <lambda> at 0x7f17e201b9d8>

在上面的示例中,您可以看到未执行逻辑,但返回了函数地址。现在,如果我们尝试运行它:

>>> a = lambda: print(x) \>>> a() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <lambda> NameError: name 'x' is not defined

您可以看到,一旦我们尝试执行逻辑,它就会与您期望的消息相冲突。

现在您的代码没有中断的原因是,一旦通过调用L()在最后一行执行了代码,就已经定义了L,如下所示:

#why doesn't this throw an error
L = lambda: print("Here is the L i defined just in this line: {}".format(L))
>>> L
<function <lambda> at 0x7fc345e4e9d8>
>>> L()
Here is the L i defined just in this line: <function <lambda> at 0x7f6b12ad79d8>


#recursive example...
L = lambda: L()

如果我调用L(),则会收到递归错误,因为该函数不断反复自我调用

  
    
      

RecursionError:超过最大递归深度