Разбор по шагам в псевдо‑записи:
𝚏𝚞𝚗𝚌𝚜 =
𝚏𝚘𝚛 𝚒 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟸):
▸ 𝚏𝚞𝚗𝚌𝚜.𝚊𝚙𝚙𝚎𝚗𝚍(𝚕𝚊𝚖𝚋𝚍𝚊 𝚡: 𝚡 * 𝚒)
— создаётся три лямбды, каждая ссылается на переменную i из внешнего scope.
— переменная i меняется: 0 → 1 → 2.
Когда выполняется [f(1) for f in funcs], цикл for i in range(3) уже завершился.
Переменная i в глобальном scope теперь равна 2 (последнее значение).
Первый вызов: funcs[0](1) → lambda x: x * i, где i = 2 → 1 * 2 = 2.
Второй вызов: funcs[1](1) → та же лямбда, та же ссылка на i, i = 2 → 1 * 2 = 2.
Третий вызов: funcs[2](1) → опять i = 2 → 1 * 2 = 2.
Чтобы каждая лямбда «запомнила» своё значение i, нужно захватить его через default argument:
funcs = [lambda x, i=i: x * i for i in range(3)]
print([f(1) for f in funcs]) # [0, 1, 2]
Здесь i=i создаёт локальную переменную внутри лямбды с значением на момент создания, а не ссылкой на внешнюю переменную.
Почему это важно
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
👍1
Разбор по шагам:
𝚍𝚎𝚏 𝚏():
𝚢𝚒𝚎𝚕𝚍 "𝚊"
𝚢𝚒𝚎𝚕𝚍 "𝚋"
𝚜 = ":".𝚓𝚘𝚒𝚗(𝚏()) — здесь берётся встроенный метод 𝚓𝚘𝚒𝚗, разделителем служит строка ":", а аргументом — генератор.
Генератор по очереди выдаёт "a", потом "b".
— «Собери все строки из генератора, вставь между ними разделитель»
— Результат — строка "a:b".
𝚙𝚛𝚒𝚗𝚝(𝚜) → 'a:b'
Почему это важно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5