Генератор и фактические значения переменных - PullRequest
0 голосов
/ 10 августа 2011

Мне нужно написать функцию, которая возвращает список функций суммы, добавляя входное число к некоторому связанному значению. Вот что я сделал:

def addition_range(start, end):
    if start >= end: return None

    #res = ( (lambda x: x + i) for i in range(start, end) ) #1
    res = [ (lambda x: x + i) for i in range(start, end) ] #2

    return res

for i in addition_range(0, 5): print( i(2) )

Вывод должен быть таким: 2,3,4,5,6, но это 6,6,6,6,6

Проблема в переменной «i», когда я вызываю функции, они используют фактическое значение i (4), а не значение, используемое при генерации списка. Проблема может быть просто решена с помощью (# 1) вместо (# 2), но мне интересно, есть ли решение для (# 2)? Я пытался

res = [ (lambda x: x + copy.deepcopy(i)) for i in range(start, end) ]

но это не помогает.

Спасибо.

WinXP + Python 3.2

1 Ответ

1 голос
/ 10 августа 2011

Самый простой способ решить эту проблему - добавить фиктивный параметр:

def addition_range(start, end):
    res = [(lambda x, i=i: x + i) for i in range(start, end)]
    return res or None

Фиктивный параметр оценивается во время определения лямбды, тогда как ваша версия оценивает i только при вызове лямбды.

Примечание: я добавил часть or None только для имитации точного поведения вашей реализации. Вероятно, было бы лучше вернуть пустой список вместо None:

def addition_range(start, end):
    return [(lambda x, i=i: x + i) for i in range(start, end)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...