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