Курс 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. Функция product() в Python
  2. Ускорение кода с помощью векторизации
  3. Работа с необработанными строками
  4. JMESPath в Python
  5. Объявление переменных в Python
  6. Комментарии в Python
  7. Переворот строки
  8. Создание уникального множества
  9. Создание пар из последовательностей
  10. Создание обратного итератора
  11. Основы работы с os
  12. Лямбда-функции в Python
  13. Работа с OpenCV
  14. Метод сравнения объектов в Python
  15. Разделение строки с помощью split()
  16. Умножение строк и списков
  17. Генерация ключей RSA
  18. Разность множеств
  19. Работа с географическими данными.
  20. Сортировка с помощью параметра key
  21. Применение функции к списку
  22. Регистрация на курсы SF Education
  23. Назначение максимального и минимального значения переменной в Python.
  24. Управление памятью в numpy.
  25. Библиотека funcy: удобные утилиты
  26. Удаление первого элемента списка
  27. Асинхронное выполнение задач в Python
  28. Удаление пробелов методом translate()
  29. Создание класса в Python
  30. Любовь к Python
  31. Проверка дубликатов в Python
  32. Модуль future Python
  33. Просмотр файла в Jupyter Noteboo
  34. Лямбда-функции в defaultdict
  35. Создание списка через цикл
  36. Обязательные аргументы в Python
  37. Дизассемблирование Python кода
  38. Генерация фальшивых данных с Faker
  39. Роль запятой в Python
  40. Удаление элемента по индексу
  41. Форматирование строк в Python
  42. Добавление элемента в список.
  43. Уникальность ключей в словаре
  44. Константы в модуле cmath
  45. Метод append() для списка
  46. Регистрация на хакатоне
  47. Генерация случайных чисел Python
  48. Установка переменной среды в Python

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