Эффект, с которым вы сталкиваетесь, называется замыкания , когда вы определяете функцию, которая ссылается на нелокальные переменные, функция сохраняет ссылку на переменную, а не получает свою собственную копию. Чтобы проиллюстрировать это, я расширю ваш код до эквивалентной версии без каких-либо пониманий или лямбд.
inner_list = []
for m in [1, 2, 3]:
def Lambda():
return m
inner_list.append(Lambda)
Таким образом, на данный момент, inner_list
содержит три функции, и каждая функция при вызове вернет значение m
. Но основной момент заключается в том, что все они видят одно и то же m
, хотя m
меняется, они никогда не смотрят на него, пока его не вызовут гораздо позже.
outer_list = []
for x in inner_list:
outer_list.append(x())
В частности, поскольку внутренний список создается полностью до того, как внешний список начинает создаваться, m
уже достиг своего последнего значения 3, и все три функции видят это же значение.