Элемент массива принимает последнее значение переменной цикла

Я делаю тестовый проект на джанго, но при реализации адресации url у меня возникли проблемы. Код файла urls.py:

from . import views
from . import models as m
urlpatterns = []


# находим все странички про сайты
s = m.Site.objects.all()
for i in range(1, len(list(s)) + 1):
    urlpatterns.append(path(str(i), lambda x: (views.index(x, i)), name="index"))

Я хочу, чтобы по адресу .../0 должна вызываться функция views.index(x, 0), по адресу .../1 должна вызываться функция views.index(x, 1), по адресу .../3 должна вызываться функция views.index(x, 3). Но такого не происходит. Все функции вызываются с параметрами views.index(x, последнее значение i). То есть вместо того, чтобы присваивать 0, 1, 2, 3..., цикл присваивает 5, 5, 5, 5, 5(иил последнее значение i) Я пробовал создавать доп переменную, второй цикл, функции copy и deepcopy, fuctools.partial Ничего не помогло. Помогите пожалуйста

Проблема в том, что метод append класса list принимает только 1 (один) параметр. Если вы хотите в качестве параметра для метода append передать лямбда-функцию, вам стоит сделать это следующим образом:

for i in range(5):
    your_list.append(lambda param = i:your_function(param))

Учтите, что функция your_function() должна возвращать то значение, которое вы хотите добавить в ваш список:

def your_function(param):
    some_value = #your actions
    return some_value

Если ваша функция должна принимать более одного аргумента, все их стоит передать сперва в лямбда-функцию

 `lambda value_1 = x, value_2 = y, value_n = z:your_function(value_1, value_2, value_n)`

Проблема в том что все лямбды ссылаются на одну и ту же переменную, не на разные её значения. Чтобы исправить это нужно создавать лямбды в разных окружениях. Каждый вызов make_f создаёт свою копию переменной i. Разные лямбды ссылаются на разные копии с разными значениями.

from . import views
from . import models as m

def make_f(i):
    return lambda x: views.index(x, i)

urlpatterns = []

# находим все странички про сайты
s = m.Site.objects.all()
for i in range(1, len(list(s)) + 1):
    urlpatterns.append(path(str(i), make_f(i), name="index"))
Вернуться на верх