Курс Python → Переменная Шредингера

Переменная Шредингера (ч.2) — это явление, когда при определении функции внутри цикла, использующей переменную цикла в своем теле, закрытие функции цикла привязывается к переменной, а не к ее значению. Это означает, что функция будет искать переменную в окружающем контексте, вместо того, чтобы использовать значение переменной в момент создания функции.

Это приводит к тому, что все функции будут использовать последнее значение, присвоенное переменной в цикле. Например, если у нас есть цикл, в котором переменная x меняется на каждой итерации, и внутри этого цикла мы определяем функцию, использующую x, то эта функция будет использовать последнее значение x из окружающего контекста.

Пример кода, демонстрирующий переменную Шредингера:


for x in range(3):
    def func():
        print(x)
    func()

В этом примере функция func будет использовать последнее значение переменной x после завершения цикла. Таким образом, при вызове func на каждой итерации цикла, будет выведено значение x из окружающего контекста, а не значение x на момент создания функции.

Избежать переменной Шредингера можно, например, передавая значение переменной в качестве аргумента функции или используя замыкания. Это позволит функции использовать конкретное значение переменной, а не искать его в окружающем контексте.

Твои коллеги будут рады, поделись в

Автор урока

Дмитрий Комаровский
Дмитрий Комаровский

Автоматизация процессов
в КраснодарБанки.ру

Другие уроки курса "Python"

  1. Блок else в циклах.
  2. Исключение NotImplementedError
  3. Строковое представление объектов
  4. Функция enumerate() в Python
  5. Создание списков в Python
  6. Создание матрицы в Python
  7. Получение локальных переменных в Python
  8. Удаление знаков препинания в Python
  9. Создание и операции с дробями
  10. Разделение строк в Python
  11. Аргумент по умолчанию
  12. Особенности множеств в Python
  13. UserList в Python: Описание и примеры использования
  14. Комментарии в Python
  15. Оператор is в Python
  16. Функция map() и ленивая оценка
  17. Проверка подстроки в строке
  18. Зарезервированные слова в Python
  19. Работа с множествами в Python
  20. Непрерывная проверка в Python
  21. Многопроцессорное программирование в Python
  22. Python Метод sleep() времени
  23. Создание Telegram-бота на Python
  24. Принципы Zen of Python
  25. Работа с PosixPath() в Python
  26. Функции-генераторы в Python
  27. capitalize() — изменение регистра первого символа строки
  28. Установка пакетов с помощью pip
  29. Преобразование числа в восьмеричную строку
  30. Очистка входных данных
  31. Динамическая типизация в Python
  32. Создание детектора плагиата
  33. Обработка ошибок в Python
  34. Избегайте ошибку FileNotFoundError
  35. Генерация случайных чисел в Python
  36. Ограничение итераций в Python
  37. Тернарный оператор в Python
  38. Подсказки типов в Python
  39. Классы данных в Python
  40. Оператор is в Python
  41. Просмотр внешних файлов в %pycat
  42. Секреты Python
  43. Удаление дубликатов из списка с помощью dict.fromkeys
  44. Преобразование данных в Python
  45. Поиск индексов подстроки
  46. TypedDict для kwargs в Python 3.12
  47. Инициализация объекта

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