Курс 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. Функция zip() в Python
  3. Работа с defaultdictами в Python
  4. Логический оператор «and» в Python
  5. Курсы Яндекс Практикум
  6. Объединение строк с помощью метода join
  7. Дефолтные параметры в Python
  8. Создание таблиц в терминале с PrettyTable
  9. Протокол управления контекстом
  10. Обработка исключений с блоком else
  11. Оператор assert в Python
  12. Вычисление натуральных логарифмов в NumPy
  13. Оператор is в Python
  14. Управление IP-адресами через прокси
  15. Оператор умножения для вектора
  16. Форматирование строк в Python
  17. Оператор деления для класса Rational
  18. Получение срезов итераторов
  19. Класс Counter() для подсчета элементов
  20. Склеивание строк через метод join()
  21. Bootle — простой веб-фреймворк
  22. Установка и использование howdoi
  23. Создание новых списков
  24. Преобразование чисел в слова
  25. Декораторы в Python
  26. Преобразование range в итератор
  27. Defaultdict в Python
  28. Python reversed() vs срез[::-1]
  29. Установка Git и AWS CLI
  30. Управление браузером с Selenium
  31. Возврат нескольких значений
  32. Разбиение строки в Python
  33. Удаление элементов во время итерации
  34. Измерение времени выполнения кода
  35. Списки: объединение, изменение
  36. Генерация QR-кодов с Python
  37. Преобразование PowerPoint в PDF.
  38. Работа с путями в Python
  39. Получение ID текущего процесса
  40. None в Python: использование и особенности
  41. Работа с аргументами командной строки в Python
  42. Очистка списка от False, None, 0, «»
  43. Python: отсутствие точек с запятыми
  44. Python Метод sleep() времени
  45. Форматирование строк с помощью f-строк
  46. Поиск индексов в списке
  47. Ключевое слово global в Python

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