Потому что i
в лямбде, вероятно, не то, что вы ожидаете. Чтобы убедиться в этом, измените код:
acts.append(lambda x: (i, i ** x))
Теперь print
сообщает вам значение i
:
(4, 16)
(4, 16)
(4, 16)
(4, 16)
(4, 16)
Это означает, что lambda
не копирует значение i
, но сохраняет ссылку на переменную, поэтому все lambda
s видят одно и то же значение. Чтобы это исправить, скопируйте i
:
acts.append(lambda x, i=i: (i, i ** x))
Маленький i=i
создает локальную копию i
внутри lambda
.
[ПРАВИТЬ] Теперь, почему это? В версиях Python до 2.1 локальные функции (то есть функции, определенные внутри других функций) не могли видеть переменные в той же области видимости.
def makeActions():
acts=[]
for i in range(5):
print len(acts)
def f(x): # <-- Define local function
return i ** x
acts.append(f)
print acts[i]
return acts
тогда вы получите ошибку, которая i
не определена. lambda
мог видеть вмещающую область за счет несколько странного синтаксиса.
Это поведение было исправлено в одной из последних версий Python (2.5, IIRC). В этих старых версиях Python вам нужно написать:
def f(x, i=i): # <-- Must copy i
return i ** x
Поскольку исправление (см. PEP 3104 ), f()
может видеть переменные в той же области, поэтому lambda
больше не требуется.