Найти - Пользователи
Полная версия: объясните на что умножается x ?
Начало » Python для новичков » объясните на что умножается x ?
1
Юрчек
Наткнулся случайно, почему так не понимаю. По моей логике у всех созданных функций должен быть разный вывод.

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 для всех функций.
Юрчек
Isem
Переменная i - одна на все лямбда-функции. Очевидно, после выполнения цикла она будет равна 9, и как результат 2*9=18 для всех функций.
Ах вот оно как. Спасибо, все встало на свои места.
Spectral
Юрчек
Наткнулся случайно, почему так не понимаю. По моей логике у всех созданных функций должен быть разный вывод.

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)
?
pill
Вот так обмануть можно:
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
Isem
Но можно сделать так:
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) )
В этом случае переменные i после вызова функции get_lambda уже будут разными сущностями и каждая лямбда-функция будет ссылаться на свою переменную i.
Virtuos86
# Используем "заморозку" значения переменной
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)
baa
def init():
return [lambda x,i=i: x*i for i in range(10)]

for l in init():
print l(2)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB