生成器和lambda函数列表:所有函数都被最后一个覆盖

时间:2019-07-19 20:34:01

标签: python list lambda generator overwrite

我编写了代码,将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倍数结束?

0 个答案:

没有答案