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

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

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

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


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

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

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

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

Автор урока

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

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

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

  1. Распаковка аргументов в Python
  2. Преобразование генераторов в циклы
  3. Оператор * в Python
  4. Работа с итераторами в Python
  5. Метод сравнения объектов в Python
  6. Генератор данных в Keras
  7. Изменяемые и неизменяемые объекты
  8. Импорт модулей в Python 3.12
  9. Возврат нескольких значений из функции
  10. Удаление файлов с shutil.os.remove()
  11. Транспонирование матрицы
  12. Итерация по итерируемым объектам
  13. Управление ресурсами с контекстными менеджерами
  14. Работа с NumPy
  15. Работа с NumPy.linalg
  16. Сравнение строк в Python
  17. Работа с итераторами через срезы
  18. Удаление дубликатов с помощью множеств
  19. Оператор «not» в Python
  20. Список и кортеж в Python
  21. Поиск индекса элемента в списке
  22. Работа с классами данных
  23. Создание новых списков в Python
  24. Сравнение def и lambda в Python
  25. Раздувающийся словарь в Python
  26. Создание файла с проверкой ошибки
  27. Шаблоны Flask: условия и циклы
  28. Python: отсутствие точек с запятыми
  29. Избегание изменяемых аргументов
  30. Разделение строки с регулярными выражениями
  31. Форматирование строк с помощью f-строк
  32. Копирование объектов в Python
  33. Оптимизация памяти с помощью __slots__
  34. Получение текущей директории
  35. Подписка на каналы разработчиков
  36. Поиск подстроки в строке
  37. Копирование списков в Python
  38. Использование type hints
  39. Функция divmod() в Python
  40. Названия переменных
  41. Обновление множества в Python
  42. Операторы присваивания в Python
  43. Оформление кода на Python
  44. Перезапуск ячейки в Jupyter Notebook с dostoevsky
  45. Codecademy в Telegram
  46. Введение в Python
  47. Открытие и запись файлов
  48. Метод __iand__ для пользовательских классов

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