2015-01-09 3 views

ответ

0

Это является общей проблемой столкнулись при использовании лямбда. Когда вы запускаете arrs[i]=lambda: func(i), лямбда не производит функцию, которая сохраняет текущее значение i. Это на самом деле точно так же, как если бы вы сделали нормальное определение функции:

def func(i): 
    return i 

i = 5 
def anon(): 
    return func(i) 

i = 0 
anon() 

i трактуется как любой стандартной переменной, значение которой первоначально искали в локальном пространстве имен функции, а потому, что это не там, он будет искать имя на глобальном уровне. В этот момент он находит текущее значение i, а не значение i, когда функция была изначально определена.

Путь к этому (и общая идиома) заключается в создании лямбда-функции с помощью ввода и присвоении текущего значения i в качестве параметра по умолчанию.

arrs={} 
def func(i): 
    print i 
for i in range(1,5): 
    arrs[i]=lambda i=i:func(i) 
for key in arrs.keys(): 
    arrs[key]() 

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

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