Не меняя основной код, поменяй только list comprehension, оставив в нём лямбду, так чтобы каждая лямбда захватывала своё значение i — как это сделать?

В comprehension задайте значение аргумента по умолчанию у lambda: [lambda i=i: i for i in iterable]. Оно вычисляется при создании каждой функции, а не при её последующем вызове.

Короткий ответ

Что ответить на собеседовании

В comprehension задайте значение аргумента по умолчанию у lambda: [lambda i=i: i for i in iterable]. Оно вычисляется при создании каждой функции, а не при её последующем вызове.

Подробный разбор

Ответ с пояснениями

В comprehension задайте значение аргумента по умолчанию у lambda: [lambda i=i: i for i in iterable]. Оно вычисляется при создании каждой функции, а не при её последующем вызове.

Обычная lambda: i обращается к общей переменной окружения, поэтому после завершения цикла функции видят её последнее значение. В lambda i=i правый i берётся на текущей итерации, а левый становится параметром конкретной функции. Если исходное тело было выражением от i, сохраните его после двоеточия. Это захват ссылки, не глубокое копирование изменяемого объекта; вызывающий также может явно передать другой аргумент.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее