15 февраля 2014 г.

Операции присваивания в import и from

Так же, как и инструкция def, инструкции import и from являются выполняемыми  инструкциями,  а  не  объявлениями  времени  компиляции.  Они  могут вкладываться в условные инструкции if, присутствовать в объявлениях функций def и так далее, и они не имеют никакого эффекта, пока интерпретатор не достигнет их в ходе выполнения программы. Другими словами, импортируемые модули и имена в них не будут доступны, пока не будут выполнены соответствующие инструкции import или from. Кроме того, подобно инструкции def, import и from – это явные операции присваивания:

•  Инструкция import присваивает объект модуля единственному имени.
•  Инструкция from присваивает одно или более имен объектам с теми же именами в другом модуле.




Все, что уже обсуждалось ранее, в равной степени применимо и к модулям. Например, имена, копируемые инструкцией from, становятся ссылками на разделяемые объекты – как и в случае с аргументами функций, повторное присваивание полученному имени не оказывает воздействия на модуль, откуда это имя было скопировано, но модификация изменяемого объекта может оказывать воздействие на объект в модуле, откуда он был импортирован. Для иллюстрации рассмотрим следующий файл small.py:
x = 1
y = [1, 2]

% python
>>> from small import x, y     # Скопировать два имени
>>> x = 42                     # Изменяется только локальная переменная x 
>>> y[0] = 42    # Изменяется непосредственно изменяемый объект

Здесь x не является разделяемым изменяемым объектом, а вот y – является. Имена y в импортирующем и импортируемом модулях ссылаются на один и тот же объект списка, поэтому изменения, произведенные в одном модуле, будут видны в другом модуле:

>>> import small       # Получить имя модуля (инструкция from его не дает)
>>> small.x            # x в модуле small – это не моя переменная x
1
>>> small.y            # Но изменяемый объект используется совместно
[42, 2]

Операция присваивания везде в языке Python работает одинаково.

1 комментарий: