Курс 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. Структура строк в Python
  3. Парсинг веб-страниц с Beautiful Soup
  4. Метод rmatmul для пользовательских матриц
  5. Работа со словарями
  6. Подсчет элементов с помощью Counter из collections
  7. Импорт и использование модулей в Python
  8. Метод setitem в Python
  9. Генератор списка с условием if
  10. Модуль antigravity: генерация координат
  11. Установка и использование Python-dateutil
  12. Библиотека funcy: удобные утилиты
  13. Атрибуты массивов в Numpy
  14. Удаление ключа из словаря в Python
  15. Игра Виселица на Python
  16. Чтение бинарного файла в Python.
  17. Проверка файла .py на синтаксис.
  18. Преобразование данных в Python
  19. Множественное присваивание в Python
  20. Работа с zip-архивами в Python
  21. Генераторные выражения и islice.
  22. Удаление элементов из списка в Python.
  23. Работа со словарями с defaultdict из collections
  24. Python enumerate() функции
  25. Копирование и вставка текста в Python
  26. Добавление вложенных списков
  27. Отступы в Python
  28. Возврат нескольких значений из функции
  29. Блок else в Python
  30. Подробная информация о %pinfo
  31. Вывод баннеров
  32. Метод split() в Python
  33. Запуск внешнего кода в Jupyter
  34. Создание веб-приложения с Flask
  35. Отправка POST-запроса в REST API
  36. Бинарный поиск
  37. Python Calendar Usage
  38. Экранирование символов в Python
  39. Работа с getopt
  40. Установка и использование emoji
  41. Нахождение отличий в списках
  42. Генераторы и сеты в Python
  43. Сравнение объектов в Python
  44. Отделение звука от видео
  45. Скачать видео с YouTube
  46. Модуль subprocess: запуск внешних команд
  47. Работа с кортежами
  48. Объединение словарей в Python

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