Найти - Пользователи
Полная версия: Помогите, пожалуйста, с задачкой.
Начало » Центр помощи » Помогите, пожалуйста, с задачкой.
1
vault
Решал задачку 3 отсюда из темы “функции”: http://pyobject.ru/blog/2010/02/04/python-quiz/
Написал:
def gen(a,b):
	lst = []
	for i in xrange(a,b+1):
		lst.append(lambda x: x+i)
	return lst

Вроде, как я полагал, должен возвращаться список функций, суммирующих с аргументом, аргумент должен варьиоваться от a до b, однако возвращается список функций, расположенных, вроде, по разным адресам, но суммирующих только с b. То есть список одинаковых функций. Почему так, подскажите пожалуйста?
Решение другое нашел методом эксперимента, но вопрос не дает мне спокойно спать - почему этот код работает не так, как ожидалось?
py.user.next
>>> def gen(a, b):
...     def f(i):
...         return lambda x: x + i
...     return [f(i) for i in range(a, b + 1)]
... 
>>> lst = gen(1, 5)
>>> lst[0](5)
6
>>> lst[2](5)
8
>>>
похоже, это связано с именем
все lambda-функции используют одно имя i, а оно к концу цикла связано с последним числом

в случае с локальной функцией i создаётся в ней каждый раз в виде локальной переменной, таким образом, все имена i разные
PooH
А темка-то уже поднималась.
Tkinter: использование процедур с параметрами в bind
непонятки с lambda
py.user.next
i=i в lambda добавляет лишнюю переменную, которой там не должно быть
vault
Спасибо, вопрос решен.
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