function lambda выводит не то, что мне нужно

def create_multiplications(n):
    return [lambda f: i*n for i in range(n)]

получаем [12, 12, 12, 12] - нужно получить [0, 4, 8, 12]

получаем [6, 6, 6] - нужно получить [0, 3, 6]


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Все лямбды в вашем коде делят одну и ту же переменную i. Привыкайте создавая замыкания прятать каждую лямбду в свой контекст:

def create_multiplications(n):

    def make(v):
        return lambda f: v

    return [make(i * n) for i in range(n)]


print(*(f(None) for f in create_multiplications(4)))
print(*(f(None) for f in create_multiplications(3)))
$ python temp.py
0 4 8 12
0 3 6

Если вам нравятся именно лямбды, то можно так. Код читается тяжело, но это то же самое:

def create_multiplications(n):
    return [(lambda v: lambda f: v)(i * n) for i in range(n)]
→ Ссылка