问题描述
这来自于描述 Python 中常见“陷阱”的 article。我的问题不是关于他所描述的问题,或者为什么下面的代码没有按照您的预期执行——它比这更基本。
def create_multiplers():
return [lambda x: i*x for i in range(5)]
for multiplier in create_multipliers():
print(multiplier(2))
我认为它调用了 create_multipliers 一次,该函数返回 lambda 函数。是迭代 5 次的 lambda 函数循环——对吗?
- multiplier(2) 如何将值传递给 lambda 函数中的 x——mutlipiers(2) 是如何导致
lambda 2: i*2 for i in range(5)
的?
for 循环迭代一个函数和返回的 lambda 函数的功能的组合真的让我感到困惑。这里有一些隐含的东西我只是不明白(我是一个中级 Python 用户)。我希望能“用文字”描述代码的执行。
解决方法
for 循环不是迭代函数,而是迭代 lambda
返回的 create_multipliers
函数列表。棘手的部分是 create_multipliers
中的 return 语句实际上是创建 (5) lambda 表达式列表的列表推导式。您可以通过单独查看此示例代码来了解这一点:
print([lambda x: i*x for i in range(5)])
输出:
[<function <listcomp>.<lambda> at 0x0E9F0198>,<function <listcomp>.<lambda> at 0x0E9F0150>,<function <listcomp>.<lambda> at 0x0E9F0108>,<function <listcomp>.<lambda> at 0x0E9F04F8>,<function <listcomp>.<lambda> at 0x0E9F0540>]
lambda
函数采用单个参数 x
,每次通过 for
循环都会调用 lambda
函数列表中的 lambda
函数由 create_multipliers
返回并将 2 的值作为 x
传入。