Курс 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. Блок else в обработке исключений
  2. Замеры производительности в Python
  3. Создание множества в Python
  4. Оптимизация сравнения в Python
  5. Тайное преобразование типа ключа
  6. Получение атрибутов и методов класса
  7. Отрицательные индексы списков в Python
  8. Переопределение метода sub
  9. Преобразование регистра символов
  10. Импортирование в Python
  11. Метод lt для сортировки объектов
  12. Метод is_absolute() для PurePath
  13. Распаковка элементов массива
  14. Работа с getopt
  15. Конкатенация строк с join() в Python
  16. Настройка логгера Logzero
  17. Удаление символа из строки
  18. Разделение строки с помощью re.split()
  19. Работа с часовыми поясами в Python.
  20. Блок try-except-else
  21. Перегрузка операторов в Python
  22. Избегайте ошибку FileNotFoundError
  23. Функция enumerate() в Python
  24. Установка Home Assistant
  25. Функция all() в Python
  26. Использование функции enumerate()
  27. Оператор умножения для вектора
  28. Игра Виселица на Python
  29. Нарезка списков в Python
  30. Бесконечная проверка в Python
  31. Гибкие функции Python
  32. Метод __ixor__ для побитового исключающего ИЛИ
  33. Атрибуты объекта в Python
  34. Оператор (*) в Python
  35. Оператор continue в Python
  36. Работа с файлами в Python
  37. Создание матрицы в Python
  38. Оптимизация памяти с помощью __slots__
  39. Работа с модулем os в Python
  40. Использование defaultdict в Python
  41. Создание комплексных чисел
  42. Метод get для словаря
  43. Модуль os в Python: работа с файлами
  44. Метод hash в Python
  45. Python: Фильтрация списков с помощью filter()
  46. Работа с файловой системой в Python

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