Курс 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. Вывод сложных структур данных с помощью pprint
  3. Очистка данных в Python
  4. Сортировка элементов с OrderedDict
  5. Создание именованных кортежей в Python
  6. Переопределение оператора % для объектов
  7. Обработка ошибок в JSON данных
  8. Изменение объектов в Python
  9. История Python
  10. Функция print() — вывод информации
  11. Итераторы в Python
  12. Лямбда-функции в Python
  13. Библиотека itertools: объединение списков
  14. Создание детектора плагиата
  15. Работа со строками в Python.
  16. SciPy: широкий функционал для математических операций
  17. Переопределение унарных операторов
  18. Определение размера папок в Python
  19. Оператор «or» в Python
  20. CLI-инструмент howdoi
  21. Метод count() для списка
  22. Основные методы NumPy
  23. Определение объема памяти объекта
  24. Измерение времени выполнения с помощью time
  25. ChainMap избыточные ключи
  26. Конкатенация строковых литералов
  27. Обновление шаблона base.html
  28. Генераторы в Python
  29. Управление асинхронными задачами с помощью Semaphore
  30. Удаление элементов по срезу
  31. Срез в Python
  32. Разделение строки с помощью split()
  33. Обработка ошибок в Python
  34. Виртуальное окружение Python
  35. Создание копии итератора
  36. Определение основы слова с showballstemmer
  37. Работа с CSV файлами
  38. Структура строк в Python
  39. Управление пакетами с pip
  40. Манипуляция формой массива в Numpy
  41. Модуль array: создание и использование массивов
  42. Работа с эмодзи в Python
  43. Генераторы списков
  44. Документирование функций в Python

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