Курс 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. Создание GUI с Tkinter: Entry
  2. Создание и удаление объектов
  3. Удаление символов новой строки в Python.
  4. Работа со слайсами
  5. ROT13 Шифр Цезаря в Python
  6. Импортирование в Python
  7. Метод join() для объединения строк
  8. Основы работы с базами данных в Python
  9. Python Метод sleep() из time
  10. Абстракции словарей и множеств в Python
  11. Экранирование символов в Python
  12. Сортировка с помощью параметра key
  13. Создание словарей и множеств в Python
  14. Установка и использование Python-dateutil
  15. Многопоточность и асинхронное программирование в Python
  16. Библиотека schedule: планировщик задач
  17. Чтение и запись TOML-конфигов
  18. Генераторы в Python
  19. Особенности ключей словаря в Python
  20. Управление User-Agent в Python
  21. Создание вложенного генератора
  22. Работа с аргументами командной строки
  23. Руководство по Pymorphy2
  24. Применение функции к элементам списка
  25. Работа со словарями Python
  26. Работа с очередями в Python
  27. Просмотр атрибутов и методов класса
  28. Получение срезов итераторов
  29. Работа с географическими данными.
  30. Обработка исключения UnboundLocalError
  31. Сериализация и десериализация объектов
  32. Упрощение условных выражений с тернарным оператором
  33. Нан-рефлексивность в Python
  34. Условные выражения в Python
  35. Пересечение списков с использованием множеств
  36. Цикл for в Python
  37. Оформление кода по PEP 8
  38. Сравнение def и lambda в Python
  39. Сортировка HTML по CSS-селектору
  40. Комментарии в Python.
  41. Управление сессиями в Python
  42. List Comprehension Tutorial
  43. Операторы объединения в Python 3.9
  44. Ключевое слово global в Python

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