Вопрос по deferred-execution, python, lambda – Отложенная оценка с использованием лямбды в Python

8

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

class Node():
    def __init__(self, v):
        self.v = v
    def value(self):
        return self.v

nodes = [Node(0), Node(1), Node(2), Node(3), Node(4), Node(2)]
results = []
for i in [0, 1, 2]:
    j = i + 3
    results.append(lambda: nodes[i].value() == nodes[j].value())

for result in results:
    print result

Все результаты верны (потому что i, j == 2,5 для всех лямбд). Как я могу отложить выполнение лямбды до ее фактического вызова, но с правильными привязками переменных? И выражения в лямбда-выражениях не обязательно равны ... есть множество других более сложных выражений.

Спасибо за любую помощь!

Я не совсем уверен, что вы пытаетесь сделать. Лямбда-выражение мне здесь не нужно. Почему вы просто не можетеresults.append(nodes[i].value() == nodes[j].value())? JAB

Ваш Ответ

3   ответа
3

[f() for f in [lambda: i for i in range(3)]]
[2, 2, 2]

Измените это на:

[f() for f in [lambda i=i: i for i in range(3)]]
[0, 1, 2]
6

Оберните это в другую лямбду:

results.append((lambda x, y: lambda: nodes[x].value() == nodes[y].value()) (i, j))

или лучше, сpartial:

from functools import partial

results.append(partial(lambda x, y: nodes[x].value() == nodes[y].value(), i, j))

Трюк с аргументами по умолчанию, ну ... трюк, и я предлагаю избежать этого.

+1 за частичное предложение.
13

i а такжеj для функции вместо того, чтобы она выглядела во внешней области видимости, вы можете использовать либо значение аргумента замыкания, либо значение по умолчанию. Самый простой способ сделать это - использовать значения аргументов по умолчанию в вашей лямбде:

for i in [0, 1, 2]:
    j = i + 3
    results.append(lambda i=i, j=j: nodes[i].value() == nodes[j].value())

Вот как это будет выглядеть как замыкание:

def make_comp_func(i, j):
    return lambda: nodes[i].value() == nodes[j].value()

for i in [0, 1, 2]:
    j = i + 3
    results.append(make_comp_func(i, j))

Похожие вопросы