Alterna · учебный материал
Локальные переменные и стек вызовов
39.2: Локальные переменные и стек вызовов. Короткая теория, один пример и пошаговая трасса Python.
Что в этом материале
- Как это устроено
- Один пример в исполнении
- Запомнить
Содержание и основные понятия
Каждый вызов получает отдельный кадр стека со своими параметрами и локальными переменными. После return кадр удаляется.
суть и практика
11 класс
ЕГЭ №16
01
Как это устроено
Каждый вызов функции получает собственный кадр стека: параметры и локальные переменные существуют до return, затем кадр исчезает.
Локальное имя.
Создаётся внутри конкретного вызова и не видно после return.
Глобальное имя.
Находится на уровне модуля; его чтение допустимо, изменение требует global.
Передача.
Python передаёт объектную ссылку по присваиванию: функция получает новое локальное имя того же объекта.
Стек.
Последний начатый вызов завершится первым.
02
Один пример в исполнении
Запусти короткую программу и переходи по строкам. Визуализатор показывает только код, текущую строку, переменные и вывод.
Если внутри функции есть присваивание
x = ...
, Python считает
x
локальным во всей функции. Попытка сначала прочитать глобальный x, а затем присвоить локальный вызовет
UnboundLocalError
. Оператор
global
нужен редко: предпочитай параметры и return. Изменение переданного списка видно снаружи, потому что оба имени ссылаются на один список; переприсваивание локального имени — нет.
Карта алгоритма
Читай слева направо, затем запускай код.
1
Начало
2
Передать x в функцию
3
Создать локальный value
4
Вернуть новое значение
5
Вывести x и y
03
Запомнить
Не называй модель «передачей по ссылке»: корректнее — передача объекта по присваиванию.
Различай изменение объекта и переприсваивание локального имени.
Проверяй стек при вложенных вызовах: у каждого свой параметр с одинаковым именем.
Синтаксис этой страницы
local variable
Имя, присвоенное в теле функции, принадлежит кадру этого вызова.
global name
Имя уровня модуля; global name разрешает присваивание ему из функции.
global x
Объявляет, что x внутри функции — глобальное имя; используй только при явной необходимости.
list.append
Меняет сам объект списка, поэтому эффект виден всем именам на этот список.
return
Закрывает кадр и передаёт значение вызывающему.
print
Позволяет сравнить глобальное и возвращённое значение.