2013-04-04 2 views
3

я играю с лямбда-функциям внутри списка понимания, и нашел странное поведениеWeird поведение лямбда в списке понимание

x = [(lambda x: i) for i in range(3)] 

print(x[0](0)) #print 2 instead of 0 
print(x[1](0)) #print 2 instead of 1 
print(x[2](0)) #print 2 

Может кто-то объяснить, почему результат не то, что я могу рассчитывать?

ответ

9

lambda s связывает переменные сами, а не те значения, которые у них были. i изменяется на 2 в конце списка понимания, поэтому все lambda s относятся к i в этой точке, и, таким образом, относятся к 2.

Чтобы избежать этого, вы можете использовать аргумент трюкпо умолчанию:

[lambda x,i=i:i for i in range(3)] 

Это связывает значение i в аргументе по умолчанию (который оценивается во время определения функции).

+0

+1 для ясности и краткости – gonz

+0

'[lambda x, j = i: j для i в диапазоне (3)]' будет еще четче. – user763305

+0

, если вы хотите использовать лямбда для определения функции, затем примените к ней переменную. Переменная в лямбде не то, что думает OP, несмотря на то, что она имеет тот же символ. Так что это, вероятно, то, что хочет OP: '[(lambda a: a) (i) для i в диапазоне (3)]' –

Смежные вопросы