Курс 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. Генератор бросков кубиков
  2. Docstring в Python
  3. Проверка элемента в множестве.
  4. Функции map() и reduce() в Python
  5. Поиск индекса элемента в списке
  6. Структуры данных в Python
  7. Принципы Zen Python
  8. Defaultdict в Python
  9. Использование модуля math
  10. Преобразование кортежа в словарь.
  11. Анализ текста на русском языке с помощью Pymystem3
  12. Сравнение объектов в Python
  13. Работа с collections в Python
  14. Операции с матрицами в Python
  15. Удаление элемента по индексу
  16. Декоратор защиты анонимных пользователей
  17. Импорт классов из другого файла
  18. Использование defaultdict в Python
  19. Хранение переменных в словаре.
  20. Ключевое слово global в Python
  21. PEP-401: оператор
  22. Оптимизация создания строк
  23. Работа с аргументами командной строки в Python
  24. Удаление эмодзи с помощью pandas
  25. Преобразование символов с помощью map
  26. Модуль itertools: эффективная работа с итераторами
  27. Работа с контекст-менеджером «with»
  28. Запуск внешних программ с subprocess
  29. Определение имен функций
  30. Оформление текста в консоли с TermColor
  31. Добавление элементов в список
  32. Хранение переменных в Python.
  33. Ускорение обработки данных с %autoawait
  34. Работа с PosixPath() в Python
  35. Генераторы в Python
  36. Решатель судоку на Python с pygame
  37. Сглаживание списка
  38. Аннотации типов в Python
  39. Объединение списков в Python
  40. Нахождение отличий в списках
  41. Мониторинг памяти с Pympler

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