Python 将lambda表达式转换为函数以更好地理解它

Python 将lambda表达式转换为函数以更好地理解它,python,python-2.7,function,lambda,Python,Python 2.7,Function,Lambda,我一直在试图解读几个lambda示例,以便充分理解它们的工作方式以及评估“名称”的含义 我一直在筛选多个性质相同的问题,所有问题都解释得很好,但是,我仍然无法理解这些特定的lambda工作的方式。因此,我一直在尝试编写单独的函数,镜像lambda表达式,我觉得这将帮助我更好地理解它们 对于以下示例: funcs = [lambda: i for i in range(3)] for f in funcs: print(f()) 这会将数字“2”打印三次。为什么会这样?我一直在尝试创建一个函数来

我一直在试图解读几个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是如何工作的;我有一段时间一直在试图理解函数体中的名称在执行函数时是如何计算的以及为什么计算的。

您的第一个示例与此等效:

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
您的第二个示例相当于:

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

internal
函数中关闭
x
非常相似,
lambda i=i:i
强制lambda锁定当前值
i
,而
lambda:i
则不锁定,当lambda执行时,它只使用
i
的值。

这个答案非常好。但是,我仍然坚持使用您提供的第一个示例。我已经连续几个小时试图弄清楚到底发生了什么。当我运行一次循环时,
0
被附加到
funcs
。为什么当循环第二次运行时,它会覆盖已附加到
funcs
0
,并将其替换为
1
,并附加另一个
1
?当我第三次运行循环(范围(3))时,
2
覆盖列表中的当前值,并向其附加一个
2
。。。这一切背后的逻辑是什么?在第一个例子中,
outer
没有被执行,因此
0
没有被追加到
funcs
,只追加了一个返回
x
的函数,第二次和第三次迭代也是如此。当then函数在循环
x
2
后执行时,因此每个函数只返回
2
。哇,这非常有意义。我以为我们在列表中添加迭代器值。。。非常感谢你帮助我更深入地理解我的问题。