2016-06-14 2 views
-5

以下のラムダ式はリストを返すべきではありませんか?現在、そうではありません。リスト演算を伴うラムダ式

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

なぜですか? 'return'はなく、' l.append'はリストを返しません。 –

+0

@LutzHorn: 'return'の欠落は問題ではありません(' lambda'sは暗黙的に評価された式の結果を返します)、 'list.append'は' None'を返します。明示的に何かを返す)、それは期待どおりに動作しないことを意味します。 – ShadowRanger

答えて

1

append副作用関数です。値を返さずに既存のリストに値を追加します(または、考え方によってはNone)。

おそらく、あなたがしたい:

lambda l, x: l + [x] 

はこれが最後に付加要素を持つ既存のリストから新しいリストを作成します。

+0

しかし、デフォルトでは、lambdaは明示的に正しい値を返すと仮定していますか?この場合のリスト – Rajeev

+0

ラムダについて何も魔法はありません。その値はそのボディの値です - この場合は 'None'です。 – Ani

+3

いいえ、暗黙のうちにreturn文の結果を返します。 'list.append'の結果は' None'なので 'None'を返します。 –

0

関数appendNoneを返しますので、ラムダはNoneを返します。またappendだけ

+1

"何も返されません "が間違っています。 **「なし」は何もない**。それが何であるかを見るには 'print(type(None))'を使ってください。 – Matthias

0

list.append()は値を返しませんが、Pythonのリストがmutable objectであるため、ローカル変数lを変更し、3は確かにそれだけで返されません、追加されます。あなたがtを変更したくない場合は、ラムダはリストtは変更されませんよう

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

はあなたが

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

t = [1] 

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

を書くことができますが、ちょうど新しいリストを返す:

たとえば、これは動作します。

関連する問題