lambda表达式是一个在运行时绑定的自由变量,而不是定义时间?

时间:2015-12-01 05:36:24

标签: python lambda

我正在学习python程序语法,没有太多的程序经验。我很难理解标题中的陈述。我找到了一段相关的代码来解释这个陈述,但我仍然无法理解它。 任何人都可以根据代码说明声明吗?还简要说明运行时和定义时间之间的区别?我尝试谷歌定义时间的术语,但我没有得到理解答案。

>>> x = 10
>>> a = lambda y: x + y 
>>> x = 20
>>> b = lambda y: x + y 
>>>
when I call the function a with argument 10, I get a unexpected result.
>>> a(10) 
30              # why the result is not 20,30 respectively ?
>>> b(10) 
30              
>>>

5 个答案:

答案 0 :(得分:4)

这样想。当一个函数被调用时,如果它中没有定义一个变量,那么它将转到上一级并尝试在那里找到变量。如果不存在,则继续向上搜索,直到达到最高级别。

在你的情况下,当你做

>>> a(10)

函数a已执行,但无法在其中找到x,它会上升一级并在那里找到xx的当前值为20.这就是您获得30

的原因

查看以下示例,它们可能会帮助您更好地理解这一点。

>>> x = 10
>>> a = lambda y: x + y 
>>> a(10)
20
>>> x = 20
>>> a(10)
30

也是这个

>>> a = lambda y: z + y 
>>> a(10)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 1, in <lambda>
NameError: name 'z' is not defined
>>> z = 20
>>> a(10)
30

在第二个示例中,z在定义a时甚至没有定义。但是当您第二次调用a时,z在前一个命名空间中定义。

答案 1 :(得分:1)

b = lambda y: x + y

实际上与

相同
def b(y):
    return x + y

当在本地命名空间中找不到x时(即在函数或其参数内),Python在&#34; parent&#34;中找到它。命名空间,在调用函数时它等于20。

答案 2 :(得分:0)

因为稍后定义的x等于20。 所以x的后期值是20, 所以当你这样做时

>>> a = lambda y: x + y 

然后x20,因为您在声明x的新值后调用了print函数。

如果您希望将答案看作20,则应在{/ 1>}之后致电a(20)

>>> x = 10
>>> a = lambda y: x + y 
>>> a(10)
20

答案 3 :(得分:0)

函数的主体,无论是用lambda还是def定义,都不会绑定变量,直到函数运行(它确实绑定范围,所以在其他地方运行它不会接收别人的x)。

如果你想要定义时间绑定,你可以使用默认参数伪造它:

a = lambda y, x=x: x + y

因此,当使用一个参数调用时,它使用x的定义时间值。

答案 4 :(得分:0)

当您定义a = lambda y: x+yxa的定义时间等于10,但在您重新定义x20 {1}},在a(x)的运行时间,将最后一个值定义为x(在运行时为20而不是10),这将是给出a(10) = x + y = 20 + 10 = 30