2
>>> def itself_and_plusone(x):
...     return x, x+1
... 
>>> itself_and_plusone(1)
(1, 2)

>>> (lambda x: x,x+1)(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

为什么?和 lambda 的解决方法?不是由

>>> (lambda x: (x,x+1))(10)
(10, 11)

因为它返回一个元组(或列表..)并且需要解包元组

4

2 回答 2

12

没有括号,它的解释如下:

((lambda x: x),x+1)(10)

这失败了,因为第二个x在 lambda 表达式之外。即使x已定义,它仍然会失败,因为您不能像使用函数一样使用元组。

这个简单的变化显示了正在发生的事情:

>>> x=42
>>> (lambda x: x,x+1)
(<function <lambda> at 0x00000000022B2648>, 43)

请注意, 43 是因为使用x了外部作用域中的 ,而不是xlambda 函数中的 。

正确的写法是lambda x: (x,x+1)。正如您所指出的,这确实返回了一个元组,但您的原始函数也是如此:

>>> type(itself_and_plusone(10))
<class 'tuple'>
于 2012-10-07T09:24:53.183 回答
2

在您的第一个示例中,元组是隐式的;当python看到表达式中的逗号时,它会为你想象括号;它对任何表达式都这样做,而不仅仅是从函数返回时:

>>> 10, 10
(10, 10)

但是在您的 lambda 示例中,您必须使它们显式,因为 python 将整个表达式视为一个新元组(包含一个 lambda 和一个x + 1表达式):

>>> (lambda x: x, 10)
(<function <lambda> at 0x10f331b90>, 10)
>>> lambda x: x, 10
(<function <lambda> at 0x10f331aa0>, 10)
>>> lambda x: (10, 10)
<function <lambda> at 0x10f314ed8>
于 2012-10-07T09:28:50.350 回答