Что вернет функция a() в место своего вызова. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Что вернет функция a() в место своего вызова.



Это значение будет зависеть от значений, возвращенных остальными функциями.

 

В КАКОМ ПОРЯДКЕ БУДУТ НАПЕЧАТАНЫ X() STARTED И X() FINISHED ДЛЯ A, B, C, D?

A() started
B() started
C() started
D() started
D() finished
C() finished
B() finished
A() finished

Причина обратного порядка завершения в том, что возврат из функций происходит именно в обратном порядке. Пока не завершится D, функция C простаивает и ожидает от нее результат. Так же и другие функции.

Стек вызовов

Стек вызовов (call stack) — стек, хранящий информацию для возврата управления из подпрограмм (функций) в программу или подпрограмму (при вложенных или рекурсивных вызовах).

При вызове подпрограммы в стек заносится адрес возврата — адрес в памяти следующей инструкции приостанавливаемой программы, а управление передается подпрограмме. При последующем вложенном или рекурсивном вызове в стек заносится очередной адрес возврата и так далее.

При возврате из подпрограммы адрес возврата снимается со стека, и управление передается на следующую инструкцию приостановленной программы (или подпрограммы).

Области видимости переменных в Python

Всякий раз, когда в программе используется некоторое имя, интерпретатор создает, изменяет или отыскивает это имя в пространстве имен.

Под термином область видимости подразумевается пространство имен для конкретного идентификатора (имени).

В языке Python область видимости тесно связана с операциями присваивания.

Имена появляются в тот момент, когда им впервые присваиваются некоторые значения, и прежде чем имена смогут быть использованы, им необходимо присвоить значения. Поскольку имена не объявляются заранее, интерпретатор Python по местоположению операции присваивания связывает имя с конкретным пространством имен. Место, где выполняется присваивание, определяет пространство имен, в котором будет находиться имя, а следовательно, и область его видимости.

По умолчанию все имена, значения которым присваиваются внутри функции, ассоциируются с пространством имен этой функции. Это означает, что:

· Имена, определяемые внутри инструкции def, видны только программному коду внутри инструкции def. К этим именам нельзя обратиться за пределами функции.

· Имена, определяемые внутри инструкции def, не вступают в конфликт с именами, находящимися за пределами инструкции def, даже если и там и там присутствуют одинаковые имена. Имя X, которому присвоено значение за пределами данной инструкции def (например, в другой инструкции def или на верхнем уровне модуля), полностью отлично от имени X, которому присвоено значение внутри инструкции def.

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

Значения переменным могут быть присвоены в трех разных местах, соответствующих трем разным областям видимости:

· Если присваивание переменной выполняется внутри инструкции def, переменная является локальной для этой функции.

· Если присваивание производится в пределах объемлющей инструкции def, переменная является нелокальной для этой функции.

· Если присваивание производится за пределами всех инструкций def, она является глобальной для всего файла.

Правила видимости имен

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

Функции образуют локальную область видимости, а модули – глобальную. Эти две области взаимосвязаны между собой следующим образом:

· Каждый вызов функции создает новую локальную область видимости.

· Операция присваивания создает локальные имена, если они не были объявлены глобальными или нелокальными. По умолчанию все имена, которым присваиваются значения внутри функции, помещаются в локальную область видимости (пространство имен, ассоциированное с вызовом функции).

Порядок сопоставления имен:

1. локальные

2. нелокальные (внутри объемлющей инструкции def)

3. глобальные (в пространстве имен модуля)

4. встроенные (предопределенные имена в модуле builtins)

Схема разрешения имен в языке Python иногда называется правилом LEGB, название которого состоит из первых букв названий областей видимости.

ПРИМЕР ПЕРЕКРЫТИЯ ОБЛАСТЕЙ ВИДИМОСТИ

Здесь инструкция присваивания X = 99 создает глобальную переменную с именем X (она видима из любого места в файле), а инструкция X = 88 создает локальную переменную X (она видима только внутри инструкции def).

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



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 315; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.44.223 (0.007 с.)