Понимание словаря со встроенными функциями

Мне нужно хранить функции в словаре, каждая функция зависит от ее ключа, скажем, для ключа 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]. Что не так с этим кодом?

Ответ 1

Чтобы исправить это, нужно изменить код:

d = {k: lambda s, k=k: s * A[k] for k in range(n)}

Без привязки Python просматривает "текущий" k, когда вызывается каждая лямбда, которая всегда находится в n-1 в исходном коде.

Ответ 2

Проблема возникает, поскольку содержимое лямбда-функции не выполняется до тех пор, пока не будет выполнена функция лямбда.

Следовательно, всякий раз, когда вы пытаетесь вызвать лямбда-функцию, она работает с самым последним значением 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