Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
37 / 31 / 13
Регистрация: 08.12.2012
Сообщений: 815

Почему переменная в замыкании не меняет значение?

16.08.2024, 14:29. Показов 456. Ответов 4

Студворк — интернет-сервис помощи студентам
почему х все время = 3

Python
1
2
3
4
5
6
7
8
9
multipliers = []
for x in range(1, 4):
    multipliers.append(lambda y: x * y)
 
m1, m2, m3 = multipliers
 
print(m1(10))
print(m2(10))
print(m3(10))
объяснения со страницы https://codechick.io/tutorials... n-closures
раздел "Замыкания и цикл for" нисколько не прояснили, кому лень прыгать по ссылкам:

"Что мы здесь делаем
Объявляем список, в котором будем хранить замыкания.
Используем лямбда-выражение, чтобы создать замыкание, и добавляем его в список на каждой итерации.
«Распаковываем» замыкания из списка и присваиваем их переменным m1, m2 и m3 соответсвенно.
Передаем значения 10, 20 и 30 в каждое замыкание и выполняем их.
Вывод

30
30
30
Работает не так, как мы ожидали. Почему?

В цикле for x меняет значения от 1 до 3. Когда цикл завершается, значение x — 3.

Каждый элемент списка — соответсвующее замыкание lambda y: x*y.

Python использует значение x для вычислений каждый раз, когда вы вызываются m1(1), m2(10) и m3(10). И поскольку в момент выполнения замыкания x всегда 3, результат всех замыканий одинаковый — 30."

Я вывел список и вот , такая картина, у всех функций разные ячейки, наверно если бы ссылались на одну и ту же х
была бы одна ячейка, хотя я мало в этом понимают
<function <lambda> at 0x035D8D48> <function <lambda> at 0x035D8D98> <function <lambda> at 0x035D8DE8>

Вопрос остается , почему переменная х после цикла имеет в списке значение = 3, а не 1, 2, 3
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2024, 14:29
Ответы с готовыми решениями:

Переменная не меняет свое значение
Привет. Почему вот в этом варианте, при вызове функции, у меня не изменяется значение переменной? Оно почему то всегда стоит на нуле. ...

Переменная меняет значение в зависимости от времени
Всем привет, прошу прощения за вопрос из разряда &quot;Хочу но не могу&quot;. Вроде не очень сложная задача... Нужно считать время с сервера или с...

Глобальная переменная не меняет значение в Асинхронном методе
Здравствуйте, возникла следующая проблема: У меня есть асинхронный метод где я считываю данные из БД, есть событие и его обработчик...

4
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.08.2024, 15:01
Python
1
multipliers.append(lambda y, x=x: x * y)
2
37 / 31 / 13
Регистрация: 08.12.2012
Сообщений: 815
16.08.2024, 15:12  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
multipliers.append(lambda y, x=x: x * y)
это решает проблему, но не объясняет, почему в моем коде
х всегда = 3
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.08.2024, 15:23
Лучший ответ Сообщение было отмечено ujif как решение

Решение

Где-то выделена память под значение икс. При формировании списка, лямбда ссылается на этот адрес. Икс пробежался в цикле и последнее значение его - 3. Лямбда при выполнении берет за икс значение в ячейке памяти, а там тройка.
2
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
16.08.2024, 15:25
Лучший ответ Сообщение было отмечено ujif как решение

Решение

Цитата Сообщение от ujif Посмотреть сообщение
это решает проблему, но не объясняет, почему в моем коде
х всегда = 3
потому, что в список записывается не значение переменной, а сама переменная в безымянной функции, при этом на момент вызова лямбды, x имеет значение 3, а y - это аргумент, вот и...
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.08.2024, 15:25
Помогаю со студенческими работами здесь

Глобальная переменная после вызова функции меняет значение
До flag = 0; odnorod_pril(buffer1); После int odnorod_pril(char *buffer) { flag точно равен 1, проверял в памяти и просто...

Переменная не меняет значения после обновления ее источныка с которого она и получила значение
Почему так происходит ?: (описал проблему в коментах) &lt;?php if(isset($_GET)) { $get_id_clic = $_GET; $query =...

Элемент массива внезапно меняет свое значение, почему?
Пишу программу кое-какую..и в одной функции происходит такая вот фигня: void screening_to_D3() { int i; int j=0; float lol; ...

Переменная "Х" меняет свое значение от начального 1.1 к конечному 4.1 с шагом 0.2. Реализовать программу используя все циклы.
Вывести только отрицательные значения и их количество(!). Переменная &quot;Х&quot; меняет свое значение от начального 1.1 к конечному 4.1 с шагом...

Почему переменная b не принимает значение?
#define _CRT_SECURE_NO_WARNINGS #include&lt;stdio.h&gt; #include&lt;math.h&gt; double inline getUravnenie(double a, double b) { if (a !=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru