Курс 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. Логирование с Logzero
  3. Конкатенация списков в Python
  4. Модуль functools в Python
  5. Метод Enumerate() для списков
  6. Метод округления чисел
  7. Необязательные аргументы в Python
  8. Поиск уникальных и повторяющихся элементов
  9. Искажение имен в Python
  10. Вычисление натурального логарифма в NumPy
  11. Структурирование именованных констант
  12. Цикл for в Python
  13. Асинхронное программирование с asyncio
  14. Модуль os: работа с файлами и папками
  15. Функции-генераторы в Python
  16. Виртуальные среды в Python
  17. Применение функции к каждому элементу списка
  18. Именование столбцов в Python с pandas
  19. Python: Фильтрация списков с помощью filter()
  20. Срезы в Numpy
  21. Управление ресурсами с контекстными менеджерами
  22. Деление в Python
  23. Импорт классов из другого файла
  24. Реализация метода __abs__ в Python
  25. Операция += для списков
  26. Работа с изображениями PIL
  27. Конвертация изображений в PDF
  28. Удаление элемента по индексу в Python
  29. Работа с кортежами в Python
  30. Модуль xkcd: добавление юмора в Python
  31. Конкатенация строковых литералов
  32. Работа с переменными в Python
  33. HTTP-запросы с библиотекой Requests
  34. Оптимизация гиперпараметров в Python
  35. Методы __repr__ и __str__ в Python
  36. Работа с JSON данными в Python
  37. Взаимодействие с sys
  38. Создание и обучение модели с Keras
  39. Перевод двоичного кода в целое число
  40. Лямбда-функции в defaultdict
  41. Пропуск начальных строк с помощью dropwhile()
  42. Работа с временем в Python
  43. Описание скриптов в README
  44. Установка random seed в Python
  45. Капитализация строк
  46. Лямбда-функции в Python

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