Курс 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"
- Блок else в обработке исключений
- Замеры производительности в Python
- Создание множества в Python
- Оптимизация сравнения в Python
- Тайное преобразование типа ключа
- Получение атрибутов и методов класса
- Отрицательные индексы списков в Python
- Переопределение метода sub
- Преобразование регистра символов
- Импортирование в Python
- Метод lt для сортировки объектов
- Метод is_absolute() для PurePath
- Распаковка элементов массива
- Работа с getopt
- Конкатенация строк с join() в Python
- Настройка логгера Logzero
- Удаление символа из строки
- Разделение строки с помощью re.split()
- Работа с часовыми поясами в Python.
- Блок try-except-else
- Перегрузка операторов в Python
- Избегайте ошибку FileNotFoundError
- Функция enumerate() в Python
- Установка Home Assistant
- Функция all() в Python
- Использование функции enumerate()
- Оператор умножения для вектора
- Игра Виселица на Python
- Нарезка списков в Python
- Бесконечная проверка в Python
- Гибкие функции Python
- Метод __ixor__ для побитового исключающего ИЛИ
- Атрибуты объекта в Python
- Оператор (*) в Python
- Оператор continue в Python
- Работа с файлами в Python
- Создание матрицы в Python
- Оптимизация памяти с помощью __slots__
- Работа с модулем os в Python
- Использование defaultdict в Python
- Создание комплексных чисел
- Метод get для словаря
- Модуль os в Python: работа с файлами
- Метод hash в Python
- Python: Фильтрация списков с помощью filter()
- Работа с файловой системой в Python















