Ответ 1
Чтобы исправить это, нужно изменить код:
d = {k: lambda s, k=k: s * A[k] for k in range(n)}
Без привязки Python просматривает "текущий" k
, когда вызывается каждая лямбда, которая всегда находится в n-1
в исходном коде.
Мне нужно хранить функции в словаре, каждая функция зависит от ее ключа, скажем, для ключа 1
связанная с лямбдой функция lambda s: s * A[1]
. Я попытался с пониманием dict, но кажется, что встроенные функции заканчиваются с последним значением цикла.
d = {k, lambda s: s * A[k] for k in range(n)} # e.g. n = 4
После этого все созданные лямбда-функции объявляются с помощью A[3]
вместо A[0], A[1], A[2]
и A[3]
. Что не так с этим кодом?
Чтобы исправить это, нужно изменить код:
d = {k: lambda s, k=k: s * A[k] for k in range(n)}
Без привязки Python просматривает "текущий" k
, когда вызывается каждая лямбда, которая всегда находится в n-1
в исходном коде.
Проблема возникает, поскольку содержимое лямбда-функции не выполняется до тех пор, пока не будет выполнена функция лямбда.
Следовательно, всякий раз, когда вы пытаетесь вызвать лямбда-функцию, она работает с самым последним значением k
(если вы выполняете del k
и пытаетесь вызвать функцию лямбда, вы должны получить сообщение об ошибке).
Ответ от @YS-L должен быть хорошим для вас.
Другой способ сделать это - сделать значение словарей связанным методом, связывая значение k. Пример -
>>> d = {k:(lambda k,s: s * A[k]).__get__(k) for k in range(n)}
>>> d
{0: <bound method int.<lambda> of 0>, 1: <bound method int.<lambda> of 1>, 2: <bound method int.<lambda> of 2>, 3: <bound method int.<lambda> of 3>}
>>> A
[1, 2, 3, 4]
>>> d[0](1)
1
>>> d[1](1)
2
>>> d[2](1)
3
>>> d[3](1)
4