Курс 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. Обновление шаблона base.html
  3. Списковые включения в Python
  4. ChainMap избыточные ключи
  5. Разделение функций на этапы
  6. Установка виртуального окружения Python
  7. Метод get() для словарей
  8. Протокол управления контекстом
  9. Классы данных в Python
  10. Работа с парами ключ-значение
  11. Работа с Event() в threading
  12. Проверка кортежей.
  13. Профилирование кода на Python
  14. Пустой оператор pass в Python
  15. Логирование в Python
  16. Форматирование строк в Python
  17. Numpy: объединение массивов
  18. Фильтрация списка от «ложных» значений
  19. Удаление дубликатов из списка
  20. Генерация случайных чисел Python
  21. Генерация тестовых данных с factory_boy
  22. Цикл for в Python
  23. Вывод переменной и строки в Python
  24. Новшества Flask 2.0
  25. Установка и использование pyshorteners
  26. Работа с SQLite в Python
  27. Работа с argparse
  28. Вычисление фазы комплексного числа
  29. Парсинг статей с Newspaper3k
  30. Вызов внешних программ в Python с помощью sh
  31. Чтение бинарного файла в Python.
  32. Настройка вывода в Numpy
  33. Поиск индексов подстроки
  34. Оператор continue в Python
  35. Многострочные комментарии в Python
  36. Чтение и запись TOML-конфигов
  37. Анонимные функции Lambda
  38. Работа с контекстным менеджером Pool
  39. Сравнение def и lambda в Python
  40. Модуль pprint
  41. Вычисление натуральных логарифмов в NumPy
  42. Разделение строки в Python
  43. Генераторы в Python
  44. Подписка на @SelectelNews
  45. Метод radd для пользовательских чисел
  46. Создание списка через итерацию

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