Курс 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. Различия символов в Python
  3. Работа с областями видимости переменных
  4. Группы исключений в Python
  5. Создание и операции с дробями
  6. Метод split() в Python
  7. Функциональное программирование.
  8. Методы работы со строками в Python
  9. Настройка вывода NumPy
  10. Поиск с библиотекой Google
  11. Оценка выражений генератора в Python
  12. Отправка POST-запроса в REST API
  13. Инверсия списка и строки в Python
  14. Изменения в обработке логических значений
  15. Установка максимального количества цифр
  16. Отображение графиков в Jupyter с Matplotlib
  17. Работа с функцией next() в Python
  18. Регулярные выражения: метод match
  19. Оператор continue в Python
  20. Зарезервированные слова в Python
  21. Метод lt для сортировки объектов
  22. Python Метод Union Множеств
  23. Логические значения в Python
  24. Работа с парами ключ-значение
  25. Любовь к Python
  26. Синхронизация потоков с time.sleep()
  27. Метод ior для битовых операций
  28. Метод bool() в Python
  29. Модуль math: основные функции
  30. split() — разделение строки
  31. Создание класса очереди
  32. Нахождение пересечения множеств
  33. Удаление элементов из списка в Python.
  34. Обработка ошибок в JSON данных
  35. Декоратор total_ordering для класса Point
  36. Использование super() в Python
  37. Логические значения в Python
  38. Комментарии в Python
  39. Измерение времени выполнения в Python
  40. Установка и использование TensorFlow
  41. Измерение времени выполнения кода в Python
  42. Работа с итераторами через срезы
  43. Сумма элементов списка
  44. Получение обратного списка чисел
  45. Анонимные функции Lambda
  46. Заказ карты Тинькофф Black
  47. Метод сравнения объектов в Python

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