Курс 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. Переопределение метода __rshift__
  3. Необязательные аргументы в Python
  4. Бесконечная проверка в Python
  5. Выборка чисел
  6. Метод __irshift__ для побитового сдвига вправо
  7. Сравнение def и lambda функций в Python
  8. Карта бомбоубежищ в Москве и Питере
  9. Функции map, filter, reduce
  10. Обмен переменными в Jupyter
  11. Печать комбинаций в Python с Itertools
  12. Работа с датой и временем в Python
  13. Функция pow() — возвести число в степень
  14. Генераторы в Python
  15. Циклы for в Python
  16. История Python
  17. Установка пакетов с помощью pip
  18. Функции с необязательными аргументами
  19. Ветвление выражения в Python
  20. Печать в одной строке
  21. Метод title() в Python
  22. Проверка дубликатов в Python
  23. Принципы программирования
  24. Переворот строки с использованием цикла
  25. Удаление файлов и папок в Python
  26. Оптимизация создания строк
  27. Комментарии в Python
  28. Переопределение метода __pow__
  29. Оператор walrus в Python
  30. IPython и Jupyter Notebook: руководство
  31. Создание Radio кнопок в tkinter
  32. Mad Libs Generator
  33. Переворот строки
  34. Группировка элементов Python
  35. Поиск самого длинного слова в списке с использованием max()
  36. Хэш-функции и метод цепочек
  37. Оператор continue в Python
  38. Инверсия списка и строки
  39. Просмотр внешнего файла в Python
  40. Получение срезов итераторов
  41. CSV строка разделение в Python
  42. Фильтрация последовательности
  43. Документирование функций в Python
  44. Работа с эмодзи в Python
  45. Форматирование строк в Python

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