我正在学习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
>>>
答案 0 :(得分:4)
这样想。当一个函数被调用时,如果它中没有定义一个变量,那么它将转到上一级并尝试在那里找到变量。如果不存在,则继续向上搜索,直到达到最高级别。
在你的情况下,当你做
>>> a(10)
函数a
已执行,但无法在其中找到x
,它会上升一级并在那里找到x
。 x
的当前值为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
然后x
为20
,因为您在声明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+y
时x
,a
的定义时间等于10
,但在您重新定义x
后20
{1}},在a(x)
的运行时间,将最后一个值定义为x
(在运行时为20
而不是10
),这将是给出a(10) = x + y = 20 + 10 = 30