我编写了代码,将lambda函数的生成器传递给varargs函数,该函数在生成器上迭代并将该函数应用于容器。但是结果却不如预期。仅调用了最后一个函数。但是n
次,其中n
是生成器中的函数数。考虑以下MWE:
>>> def f(*fs):
... for f in fs:
... print(f.__code__)
... print(f(1))
...
>>> f(*(lambda x : k*x for k in range(3)))
<code object <lambda> at 0x7fe1ca683130, file "<stdin>", line 1>
2
<code object <lambda> at 0x7fe1ca683130, file "<stdin>", line 1>
2
<code object <lambda> at 0x7fe1ca683130, file "<stdin>", line 1>
2
我接下来测试了不带函数调用和varargs部分的lambda列表。结果相同。
>>> for f in [lambda x : k*x for k in range(3)]:
... print(f.__code__)
... print(f(1))
...
<code object <lambda> at 0x7fe1ca634b30, file "<stdin>", line 1>
2
<code object <lambda> at 0x7fe1ca634b30, file "<stdin>", line 1>
2
<code object <lambda> at 0x7fe1ca634b30, file "<stdin>", line 1>
2
然后我仅用一个生成器对其进行了测试。 f.__code__
的打印显示该功能已在现场重新定义。它始终是相同的地址,但内容不同。因此,每次生成器继续运行时,以前的函数都会被覆盖。
>>> for f in (lambda x : k*x for k in range(3)):
... print(f.__code__)
... print(f(1))
...
<code object <lambda> at 0x7fe1ca683130, file "<stdin>", line 1>
0
<code object <lambda> at 0x7fe1ca683130, file "<stdin>", line 1>
1
<code object <lambda> at 0x7fe1ca683130, file "<stdin>", line 1>
2
为什么会这样?如何将lambda生成器传递给函数,而不会以最后一个函数的n
倍数结束?