Курс Python → Решение переменной Шредингера
Переменная Шредингера — это понятие из программирования, которое описывает ситуацию, когда значения переменных в коде кажутся разными на разных этапах выполнения программы. В данном случае, переменная x меняется на каждой итерации цикла до добавления функции some_func к списку funcs, но все функции в списке в итоге возвращают одно и то же значение 6 после завершения цикла.
Это происходит из-за того, что функции, добавленные в список funcs, сохраняют ссылку на переменную x на момент их добавления. Таким образом, при вызове функций после завершения цикла, они все обращаются к последнему значению x, которое было в цикле — в данном случае, 6.
Для решения проблемы переменной Шредингера в Python можно использовать замыкания (closures). Вместо того, чтобы передавать переменную x напрямую в функцию some_func, можно создать вложенную функцию, которая будет запоминать значение x на момент создания.
def create_closure(x):
def some_func():
return x
return some_func
funcs = []
for i in range(1, 6):
funcs.append(create_closure(i))
for func in funcs:
print(func())
В этом примере функция create_closure создает замыкание с переменной x, которая фиксирует значение x на момент создания функции some_func. Таким образом, каждая функция в списке funcs будет возвращать свое уникальное значение x, как было задумано изначально.
Другие уроки курса "Python"
- Хешируемые ключи в Python
- Логирование с Logzero
- Конкатенация списков в Python
- Модуль functools в Python
- Метод Enumerate() для списков
- Метод округления чисел
- Необязательные аргументы в Python
- Поиск уникальных и повторяющихся элементов
- Искажение имен в Python
- Вычисление натурального логарифма в NumPy
- Структурирование именованных констант
- Цикл for в Python
- Асинхронное программирование с asyncio
- Модуль os: работа с файлами и папками
- Функции-генераторы в Python
- Виртуальные среды в Python
- Применение функции к каждому элементу списка
- Именование столбцов в Python с pandas
- Python: Фильтрация списков с помощью filter()
- Срезы в Numpy
- Управление ресурсами с контекстными менеджерами
- Деление в Python
- Импорт классов из другого файла
- Реализация метода __abs__ в Python
- Операция += для списков
- Работа с изображениями PIL
- Конвертация изображений в PDF
- Удаление элемента по индексу в Python
- Работа с кортежами в Python
- Модуль xkcd: добавление юмора в Python
- Конкатенация строковых литералов
- Работа с переменными в Python
- HTTP-запросы с библиотекой Requests
- Оптимизация гиперпараметров в Python
- Методы __repr__ и __str__ в Python
- Работа с JSON данными в Python
- Взаимодействие с sys
- Создание и обучение модели с Keras
- Перевод двоичного кода в целое число
- Лямбда-функции в defaultdict
- Пропуск начальных строк с помощью dropwhile()
- Работа с временем в Python
- Описание скриптов в README
- Установка random seed в Python
- Капитализация строк
- Лямбда-функции в Python















