def init():
cb = []
for i in range(10):
cb.append(lambda x: x*i)
return cb
for l in init():
print l(2)
def init():
cb = []
for i in range(10):
cb.append(lambda x: x*i)
return cb
for l in init():
print l(2)
IsemАх вот оно как. Спасибо, все встало на свои места.
Переменная i - одна на все лямбда-функции. Очевидно, после выполнения цикла она будет равна 9, и как результат 2*9=18 для всех функций.
ЮрчекВозможно, вы хотели вот так:
Наткнулся случайно, почему так не понимаю. По моей логике у всех созданных функций должен быть разный вывод.def init():
cb = []
for i in range(10):
cb.append(lambda x: x*i)
return cb
for l in init():
print l(2)
def init():
cb = []
for i in xrange(10):
cb.append(lambda x,i: x*i)
return cb
for l in xrange(len(init())):
print init()[l](2, l)
from __future__ import print_function
def init():
cb = []
for i in xrange(10):
cb.append(eval('lambda x: x * %s' % i, globals(), locals()))
return cb
for f in init():
print(f(2), end=" ")
----------------------------------
0 2 4 6 8 10 12 14 16 18
def init():
def get_lambda(i): return lambda x: x*i
return [get_lambda(i) for i in range(10)]
for l in init():
print( l(2) )
# Используем "заморозку" значения переменной
def init():
cb = []
for i in xrange(10):
cb.append(lambda x, i=i: x*i)
return cb
for l in init():
print l(2)
# Используем замыкание
def init():
cb = []
for i in xrange(10):
cb.append(
(lambda i: lambda x: x*i)(i)
)
return cb
for l in init():
print l(2)
def init():
return [lambda x,i=i: x*i for i in range(10)]
for l in init():
print l(2)