我有这个:
>>> a = lambda : lambda x : x * x
每次都给我一个恒定的地址:
>>> a
<function <lambda> at 0x7f22769e76e0>
>>> a
<function <lambda> at 0x7f22769e76e0>
>>> a
<function <lambda> at 0x7f22769e76e0>
但事实并非如此。为什么这样?
还要注意它只提供两个地址?为什么这样?
内部lambda函数是在运行时创建的,每次调用a()
时都会返回吗?是否在声明时创建了?
>>> a()
<function <lambda> at 0x7f22769e7320>
>>> a()
<function <lambda> at 0x7f22769e75f0>
>>> a()
<function <lambda> at 0x7f22769e7320>
>>> a()
<function <lambda> at 0x7f22769e75f0>
答案 0 :(得分:2)
a
是函数本身,作为变量。除非在内存中以某种方式移动,否则它的地址不会改变。
a()
实际上调用了该函数。在通过()
调用函数之前,函数不会执行任何操作。所以,是的,这里你的内部lambda函数正在动态创建。这将是你在那里看到的地址。正如Blckknght评论的那样,垃圾收集可能会导致内存的重用。
答案 1 :(得分:1)
是的,你的理解是正确的:“内部”lambda仅在评估“外部”lambda时创建,直到调用它(外部)才会发生。