Курс 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. Команда %dhist — список посещенных каталогов
  3. Принципы Zen Python
  4. Метод get() для словарей
  5. Использование defaultdict в Python
  6. Применение команды break
  7. Форматирование данных с pprint
  8. Срезы в Python
  9. Добавление элемента к кортежу
  10. Генерация случайных чисел в Python
  11. Получение идентификатора объекта в памяти
  12. Big O оптимизация
  13. Создание и инициализация объектов
  14. Создание объекта timedelta
  15. Сортировка данных в Python
  16. Создание словарей и множеств в Python
  17. Удаление файлов с shutil.os.remove()
  18. Преобразование букв в нижний регистр
  19. Объединение списков с помощью zip
  20. Оператор break в Python
  21. Переменная Шредингера
  22. Контекстный менеджер в Python
  23. Профилирование с Pandas
  24. Метод Self в Python
  25. Цикл for в Python
  26. Поиск файлов по шаблону
  27. Комментарии в Python
  28. Работа с датами в Python
  29. Работа с географическими данными.
  30. Генераторы в Python
  31. Работа с аргументами командной строки
  32. Профилирование данных с Pandas
  33. Объединение кортежей в Python
  34. Получение обратного списка чисел
  35. Создание обратного итератора
  36. Установка пакетов с помощью pip
  37. Установка пакета в Python
  38. Обмен значений переменных в Python
  39. Замыкания в Python
  40. Методы работы со строками в Python
  41. Оптимизация памяти с помощью __slots__
  42. Разделение функций на этапы
  43. Преобразование текста в речь с Python
  44. Декодирование байтов в строку

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