Как сделать индекс статическим для лямбда-выражения Python - PullRequest
0 голосов
/ 03 сентября 2018

Скажите, у меня есть эти строки кода

index = 1
test = lambda t : t[index]+1
index = 0
print(test([5, 0]))

Результат равен 6, я ожидаю, что он будет равен 1. Как сделать индекс внутри лямбда-выражения статическим, не записывая t[1]+1, т. Е. Используя переменную?

Ответы [ 4 ]

0 голосов
/ 03 сентября 2018

index не является ни аргументом, ни локальной переменной в test(), поэтому он действительно разрешен как нелокальный (+> он просматривается в пределах объема).

Простым решением является сделать index аргументом test со значением по умолчанию, фиксирующим значение index во время определения:

index = 1
test = lambda t, _index=index: t[_index]+1
index = 0
print(test([5, 0])) 
0 голосов
/ 03 сентября 2018

Вы можете использовать operator.itemgetter для создания вызываемого объекта, который извлекает n -й элемент из списка:

from operator import itemgetter

index = 1
get_val = itemgetter(index)
test = lambda t: get_val(t) +1
index = 0

print(test([5, 0]))  # 1

Но здесь нет смысла для оператора lambda, вы можете явно определить функцию:

def test(t):
    return get_val(t) + 1
0 голосов
/ 03 сентября 2018

Закрытия Python с поздним связыванием . Это означает, что значения переменных, используемых в замыканиях, ищутся во время вызова функции.

Чтобы избежать эффекта позднего связывания, вы можете использовать лямбду с аргументом по умолчанию:

index = 1
test = lambda t, index=index: t[index]+1  # binds index at definition time
index = 0
print(test([5, 0]))  # 1
0 голосов
/ 03 сентября 2018

Вы можете использовать lambda для возврата lambda:

test = (lambda index: lambda t: t[index] + 1)(index)

Таким образом, переменная index является локальной для возвращаемой лямбда-функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...