为什么Python不允许在lambda表达式的局部范围内使用语句?

时间:2014-05-24 07:23:26

标签: python lambda scope expression

我找到了这个页面:

http://effbot.org/pyfaq/why-can-t-lambda-forms-contain-statements.htm

尽管如此,原因尚不清楚。 Lambdas是强大的,在我看来,如果可以在其范围内使用陈述/作业,它们会更多。

例如:

y = 0
f = lambda x: y = 5, x+y # Statements first, expression later.
print f(5) # 10

有人必须考虑到这一点,并且必须有一个原因,为什么它没有实现(也许是为了避免使用它们而不是一个简单的def?)。

2 个答案:

答案 0 :(得分:3)

首先需要了解lambda构造创建一个表达式,它会计算到创建的函数。这与作为语句的def非常不同,并且通过将创建的函数绑定到指定名称的副作用起作用。要使lambda有用,必须才能成为表达式,否则您无法将其嵌套在其他表达式中。

正如链接的FAQ解释的那样,不允许其他Python表达式嵌套语句。这是因为Python语言的核心语法权衡排除了这种可能性,如persuasively argued by Guido。由于有一个非常简单的解决方法,即使用def,因此在lambda中使用语言的语法来容纳语句是不值得的。

另请注意,lambda并不是语言中唯一需要表达式的地方。您不能在ifwhile的测试中输入语句,也不能在for语句所要求的表达式中输入语句。然而,这被认为是一件好事 - 如果你需要语句,只需将它们提取到函数中并调用它即可。完全相同的情况适用于lambda

答案 1 :(得分:0)

有什么不同:

f = lambda x: y = 5; x+y

def f(x):
    y = 5
    return x+y

后者更具可读性,它具有一致的语法,并且您需要编写的唯一代码比使用lambda定义的return更多。因此,您不需要提出建议,只需要更复杂的规则。