Так же, как и инструкция 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 работает одинаково.
• Инструкция 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 работает одинаково.
Лутцу отстегните за перепечатку)
ОтветитьУдалить