Курс 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"

  1. Удаление ресурса в Python
  2. Генераторы в Python
  3. Вычисление фазы комплексного числа
  4. Мониторинг работы программы Py-spy
  5. Основные методы NumPy
  6. Библиотека schedule: планировщик задач
  7. Создание задания в Cron
  8. Многострочные комментарии в Python
  9. Нахождение разницы между списками в Python
  10. Создание .exe файла с pyinstaller
  11. Функции в Python: создание и вызов
  12. Отступы в Python
  13. Изменения в обработке логических значений
  14. Метод lt для сортировки объектов
  15. Объединение списков в Python.
  16. Преобразование чисел в слова
  17. Скрытие вывода данных
  18. Лямбда-функции в defaultdict
  19. Перевернуть список в Python
  20. Создание и операции с дробями
  21. Копирование в Python
  22. Разделение функций на этапы
  23. Декораторы для регистрации функций
  24. Метод get() в Python
  25. Форматирование строк в Python
  26. Проблемы с именами переменных
  27. Сортировка с параметром key
  28. Логические значения в Python
  29. Проверка дубликатов в Python
  30. Нахождение максимального значения и его индекса в списке
  31. Преобразование объекта в строку
  32. Управление IP-адресами через прокси
  33. Метод eq для сравнения объектов
  34. Переменные класса и экземпляра
  35. Работа с библиотекой xkcd
  36. Многострочные комментарии в Python
  37. Метод classmethod
  38. Создание GUI на Tkinter
  39. Новшества Flask 2.0
  40. Методы и функции в Python
  41. Тестирование времени с Freezegun
  42. Курс по дообучению ChatGPT
  43. Удаление ключей из словаря
  44. Генераторы по генератору
  45. Обработка исключения UnboundLocalError
  46. Расчет времени выполнения
  47. Пропуск начальных строк с помощью dropwhile()

Marketello читают маркетологи из крутых компаний