我一直试图破译几个lambda示例,以便完全理解它们的工作方式以及评估“名称”的含义。
我一直在筛选同样性质的多个问题并且所有问题都得到了很好的解释,但是,我仍然无法理解这些特殊lambda的工作方式。因此,我一直在尝试编写单独的函数,镜像lambda表达式,我觉得这样可以帮助我更好地理解它们。
对于以下示例:
funcs = [lambda: i for i in range(3)]
for f in funcs: print(f())
这会打印数字'2',三次。为什么是这样?我一直在尝试创建一个函数来镜像发生的确切过程。但是,我一直在尝试多种方法,仍然无法在我的列表中打印数字'2'三次。
然而,在下一个例子中,我可以在为它创建一个类似的函数后更好地理解它。
funcs = [lambda i=i:i for i in range(3)]
for f in funcs: print(f())
分别打印出1,2,3,这就是我希望它的工作方式。这是我的自定义功能:
func = []
def i(i):
for i in range(i):
func = i
>>> i(3)
0
1
2
上面的函数是否正确,因为它以一种我们可以详细描述每一步的方式镜像lambda表达式?我已经尽力了。
正如我上面提到的,我一直在开发一个函数来镜像第一个lambda表达式,因此我并不完全知道表达式是如何工作的。任何人都可以帮我分解这个lambda的工作方式;我被困了一段时间试图理解在执行函数时如何以及为什么要评估函数体中的名称。
答案 0 :(得分:2)
你的第一个例子相当于:
In [ ]:
def outer():
return x
funcs = []
for x in range(3):
funcs.append(outer)
for f in funcs:
print(f())
Out[ ]:
2
2
2
但这只相当于:
In [ ]:
funcs = [outer] * 3
x = 2
for f in funcs:
print(f())
Out[ ]:
2
2
2
你的第二个例子相当于:
In [ ]:
def outer(x):
def inner():
return x
return inner
funcs = []
for x in range(3):
funcs.append(outer(x))
for f in funcs:
print(f())
Out[ ]:
0
1
2
就像x
函数中inner
的关闭一样,lambda i=i: i
强制lambda锁定当前值i
,而lambda: i
不会当lambda被执行时,它只使用i
的值。