Курс 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. Метод join() для объединения элементов строки
  2. Удаление элемента по индексу
  3. Создание копии списка в Python
  4. Построение графиков в Matplotlib
  5. Определение относительного пути
  6. Создание словарей и множеств в Python
  7. Хранение переменных в Python.
  8. Работа с JSON данными в Python
  9. Множественное наследование в Python
  10. Печать списка с помощью метода join
  11. Списковое включение в Python
  12. Создание словарей с defaultdict
  13. Печать в одной строке
  14. Игра «Угадывание чисел»
  15. Многострочные комментарии в Python
  16. Генераторы списков в Python
  17. Работа с f-строками 2.0
  18. TON Smart Challenge #2: участие и подготовка
  19. Функция print() — вывод информации
  20. Фильтрация элементов с помощью islice
  21. Создание namedtuple списком полей
  22. Работа с контекст-менеджером «with»
  23. Применение функции к списку
  24. Операции с кортежами
  25. Отладчик pdb: начало работы
  26. Метод get для словарей
  27. Работа с коллекциями Python
  28. Многострочные комментарии в Python
  29. Генераторы списков в Python
  30. Функция map() и ленивая оценка
  31. Оператор zip в Python
  32. Логические значения в Python
  33. Объединение списков с помощью zip
  34. Работа с рекламными данными в Pandas
  35. Шаблоны Flask: условия и циклы
  36. Настройка шрифта и цвета в Tkinter
  37. Метод __index__ в Python
  38. Инициализация объекта
  39. Очистка вывода в Python
  40. Отладка регулярных выражений в Python
  41. Преобразование символов в нижний регистр
  42. Управление экспортом элементов
  43. Сортировка HTML-элементов
  44. Возврат нескольких значений
  45. Разработка Telegram-ботов
  46. Работа со строками
  47. Python Метод Union Множеств

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