Это является общей проблемой столкнулись при использовании лямбда. Когда вы запускаете 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
значения.