2016-06-14 74 views
-5

下面的lambda表達式不應該返回一個列表嗎?目前,事實並非如此。帶列表操作的Lambda表達式

>>> f=lambda l ,x:l.append(x) 
>>> print f([1],3) 
None 
+3

爲什麼?沒有'return'並且'l.append'不返回一個列表。 – 2016-06-14 12:15:23

+0

@LutzHorn:缺少'return'並不重要('lambda's會返回隱式計算表達式的結果),但是,'list.append'返回'None'(函數的默認返回值' t明確地返回),這意味着它不會按預期工作。 – ShadowRanger

回答

1

append是一個副作用函數;它將值添加到現有列表中而不返回值(或無,這取決於您想如何考慮它)。

也許你想:

lambda l, x: l + [x] 

這個創建,並在最後追加一個元素現有列表的新列表。

+0

但是默認情況下,lambda是假設明確返回一個值嗎?在這種情況下列出 – Rajeev

+0

lambda沒有什麼神奇的,它的值是它的主體的值 - 在這種情況下是'None'。 – Ani

+3

不,它隱式返回返回語句結果。 'list.append'的結果是'None',所以它返回'None'。 –

0

函數append返回None所以你的lambda也返回None。另外,append改變局部變量l只有

+1

它「不返回任何東西」是錯誤的。 **'沒有'不是什麼**。使用'print(type(None))'來查看它是什麼。 – Matthias

0

list.append()不返回一個值,但由於Python列表是mutable object3的確會追加,它只是沒有得到恢復。

例如,這將工作:

t = [1] 
f(t, 3) 
print(t)  # [1, 3] 

如果你不想修改t你可以寫

f = lambda l, x: l + [x] 

t = [1] 

print(f(t, 3)) # [1, 3] 
print(t)  # [1] 

的拉姆達不會修改列表t,但只返回一個新的列表。