【发布时间】:2014-08-01 06:52:21
【问题描述】:
我是 python 新手,已经编码了几年。 我刚认识了 lambda。
我想知道 lambda 函数在内存方面是如何工作的。 通常它们存储在计算机内存中的什么位置以及如何调用它们?
它们会变得像内联函数吗?或者他们有一个指针,即使他们不会再次被调用。
【问题讨论】:
标签: python function memory lambda
我是 python 新手,已经编码了几年。 我刚认识了 lambda。
我想知道 lambda 函数在内存方面是如何工作的。 通常它们存储在计算机内存中的什么位置以及如何调用它们?
它们会变得像内联函数吗?或者他们有一个指针,即使他们不会再次被调用。
【问题讨论】:
标签: python function memory lambda
Python 中的lambda 表达式几乎是编写单行函数的一种简写方式。因为它往往与编程的函数式风格相关联,所以有些人对 lambdas 感到不舒服,他们更愿意编写等效的短函数并在他们的代码中使用对这些函数的引用。
对于任何表达式expr(a, b, ...),那么f = lambda: a, b, ... : expr(a, b, ...) 与
def f(a, b, ...):
return expr(a, b, ...)
您可以使用dis 模块对每个编译后的 Python 字节码进行反汇编,以进行比较,如下所示。
from dis import dis
flambda = lambda a, b: a + b
def ffunction(a, b):
return a + b
dis(flambda)
print "-------------"
dis(ffunction)
这个简单程序的输出表明编译后的字节码完全相同。
3 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 BINARY_ADD
7 RETURN_VALUE
-------------
6 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 BINARY_ADD
7 RETURN_VALUE
这两个对象都是<type function> 类型,只能通过检查一些模糊的属性(例如.func_name)来区分,ffunction 是"ffunction",而flambda 是"<lambda>"。
与所有 Python 对象一样,一旦函数和 lambda 超出范围或以其他方式从其上次引用中解除绑定,它们就有资格进行销毁和垃圾回收。何时发生取决于实施。
【讨论】:
简单解释:lambda 是一个表达式,可以作为函数调用。
它是编写“临时函数”的一种简写方式,可以在需要时使用,但之后不再需要。
就像 Python 中的其他任何东西一样,如果没有对它的引用 - Python 最终会摆脱它(回收内存/垃圾收集等)。使用。
不过,lambda 有一些优点,因为它们是表达式,所以可以在普通方法无法使用的地方使用。
【讨论】: