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

Проблема

Насколько мне известно, это нежелательное поведение (по моим стандартам) происходит из-за позднего связывания в отличие от раннего связывания в цикле. То есть, когда вызывается лямбда-функция, все переменные итератора имеют одинаковые значения, а именно те, которые после завершения всех циклов.

      for color in range(N_COLORS):
    for hsv in range(N_HSV):
        for mm in range(N_MINMAX):
            cv2.createTrackbar(STR_COLORS[color] + STR_HSV[hsv] + STR_MINMAX[mm], window_title, 0, 255, lambda x: change(color, hsv, mm, x))

Вопрос

Как я могу переписать этот код, чтобы каждый созданный трекбар имел разные значения дляcolor,hsvиmmвместо того, чтобы все они имели одинаковое значение.

Минимальный рабочий пример:

      import numpy as np

N_COLORS = 3
N_HSV = 3
N_MINMAX = 2

list = []


for color in range(N_COLORS):
    for hsv in range(N_HSV):
        for mm in range(N_MINMAX):
            list.append(lambda: print(color, hsv, mm))
            
list[0]()
list[1]()
list[2]()

ожидаемый результат:
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]

фактический результат:


[2, 2, 1]

Отвечать

Согласно дубликату, это решает его

      cv2.createTrackbar(STR_COLORS[color] + STR_HSV[hsv] + STR_MINMAX[mm], window_title, 0, 255, lambda x, color=color, hsv=hsv, mm=mm: change(color, hsv, mm, x))

0 ответов

Другие вопросы по тегам