Курс 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. Обновление ключей в Python
  5. Подсчет элементов в Python
  6. Регулярные выражения в Python
  7. Дефолтные параметры в Python
  8. Печать календаря
  9. Принципы LSP и ISP в Python
  10. Python 3.12: переиспользование кавычек
  11. Преобразование Excel в PDF с Spire.XLS
  12. Цикл for в Python
  13. Группировка элементов Python
  14. Переопределение оператора % для объектов
  15. Получение имени функции с помощью inspect
  16. Курс Data Scientist в медицине
  17. Преобразование данных в Python
  18. Очистка данных с Pandas
  19. Обработка ошибок в Python
  20. Реализация операции -= для пользовательского класса
  21. Встроенные функции Python
  22. Создание словаря в Python
  23. Вывод с переменной через запятую
  24. Отображение HTML кода в Python
  25. Создание итератора
  26. Python: отсутствие точек с запятыми
  27. Импортирование в Python
  28. Метод count() для списков
  29. inspect в Python: анализ кода
  30. Метод get() для словарей
  31. Установка и использование модуля Wikipedia
  32. Поток данных в Python
  33. Эффективная конкатенация строк в Python
  34. Python itertools combinations() — группировка элементов
  35. Метод enumerate() в Python
  36. Функции map() и reduce() в Python
  37. Numpy: разбиение массивов
  38. Сохранение и загрузка модели в PyTorch
  39. Функциональное программирование.
  40. Анонимные функции в Python
  41. Упрощенный вывод данных в Python
  42. Отладка в командной строке
  43. Работа с WindowsPath()
  44. Работа с кортежами
  45. Шаблоны и наследование в Flask
  46. Работа с географическими данными.
  47. Печать комбинаций в Python с Itertools
  48. Структуры данных в Python
  49. Solidity для DeFi Ethereum

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