Показаны сообщения с ярлыком Области видимости. Показать все сообщения
Показаны сообщения с ярлыком Области видимости. Показать все сообщения

11 ноября 2015 г.

Вложенные пространства имен

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

4 октября 2015 г.

Импортирование и области видимости

Как  мы  уже  знаем,  невозможно  получить  доступ  к  именам,  определенным в другом модуле, не импортировав его предварительно. То есть вы никогда автоматически не получите доступ к именам в другом файле, независимо от вида импортируемого модуля и вызовов функций в вашей программе. Смысл переменной всегда определяется местоположением операции присваивания в программном коде, а для обращения к атрибутам всегда необходимо явно указывать объект.

1 ноября 2012 г.

Области видимости, углубляемся

Сохранение состояния объемлющей области видимости 
с помощью аргументов по умолчанию:
Из-за отсутствия вложенных областей видимости в инструкциях def в более ранних версиях Python, программный код мог бы терпеть неудачу.
Чтобы разрешить ситуацию, программисты обычно использовали аргументы со значениями по умолчанию для передачи (сохранения) объектов, расположенных в объемлющей области видимости:
def f1():
    x = 88
    def f2(x=x):       # Сохраняет значение переменной x в объемлющей области 
        print(x)       # в виде аргумента
    f2()

f1()                   # Выведет 88
Этот  фрагмент  будет  работать  во  всех  версиях  Python.
-----------------------------------------------------------------

Python, области видимости


Области видимости и
вложенные функции

С появлением вложенных функций в области видимости поиск стал сложнее.

Внутри функции:
  • При обращении к переменной (X) поиск имени X сначала производится в локальной области видимости (функции)затем в локальных областях видимости всех
лексически-объемлющих функций, изнутри наружу, затем в текущей глобальной области видимости (в модуле) и, наконец, во встроенной области видимости (модуль builtins). Поиск имен, объявленных в инструкции global, начинается сразу с глобальной (в модуле) области видимости.

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

Обратите  внимание,  что  инструкция  global  отображает  имена  в  область видимости объемлющего  модуля.  Когда  имеются вложенные функции,  можно получить значения переменных в объемлющих функциях, но чтобы их изменить, переменные должны быть указаны в объявлении nonlocal.

29 октября 2012 г.

Области видимости


Области видимости

Данная тема очень важна в изучение и понимании, так как Python не использует никаких идентификаторов доступа, как это делается в других языках. После прочтения данного поста, вы поймете что правильное распределение областей видимостей, вполне необходимо для обеспечения нормальной работы программ, но важно запомнить: переусердствование в использовании глобальных переменных - является дурным тоном. Поэтому мы и будем учится правильно расставлять области видимости...

Область видимости - место где определяются переменные и выполняется их поиск. 
Всегда, когда  в программе используется какое то имя, интерпретатор создает, изменяет  или  отыскивает это имя в пространстве имен – в области, где находятся имена.  Когда мы говорим о поиске значения имени применительно к программному коду, под термином область видимости подразумевается пространство имен: то есть место в программном коде, где имени было присвоено значение, определяет область видимости этого имени для программного кода.

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

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