Курс 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. Класс UserDict: дополнительная функциональность
  3. Измерение времени выполнения кода в Python
  4. Реализация операции -= для пользовательского класса
  5. Отрицательные индексы списков в Python
  6. Форматирование кода на Python
  7. Взаимодействие с внешними процессами в Python
  8. Объединение списков в строку
  9. Метод __call__ в Python
  10. Запуск Python из интерпретатора
  11. Логирование с Logzero
  12. Обезопасьте ввод данных
  13. Функции any() и all() в Python
  14. Функция enumerate() в Python
  15. Лямбда-функции в Python
  16. Создание словаря с значением по умолчанию
  17. Переворот последовательности
  18. Работа со словарями Python
  19. Работа с часовыми поясами в Python.
  20. Удаление URL-адресов в Python
  21. Срезы в Python
  22. Поиск простых чисел
  23. Оператор Walrus в Python
  24. split() — разделение строки
  25. Функция enumerate в Python
  26. Обработка исключений в Python
  27. Множественное присваивание в Python
  28. Объединение словарей в Python
  29. Изменение IP-адреса в Python
  30. Преобразование чисел в Python
  31. Работа с deque в Python
  32. Замеры производительности в Python
  33. Чтение и запись TOML-конфигов
  34. Python Аргументы по умолчанию
  35. Фильтрация списков с itertools
  36. Цепные операции в Python
  37. Изменения в обработке логических значений
  38. Замыкания в Python
  39. Бинарный поиск
  40. Создание новых списков в Python
  41. Использование type hints
  42. Печать комбинаций в Python с Itertools
  43. Генераторы в Python
  44. Генераторы в Python
  45. Проверка типа объекта в Python
  46. Профилирование данных с Pandas

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