Как мы уже знаем, невозможно получить доступ к именам, определенным в другом модуле, не импортировав его предварительно. То есть вы никогда автоматически не получите доступ к именам в другом файле, независимо от вида импортируемого модуля и вызовов функций в вашей программе. Смысл переменной всегда определяется местоположением операции присваивания в программном коде, а для обращения к атрибутам всегда необходимо явно указывать объект.
Например, рассмотрим два следующих простых модуля. Первый, в файле moda.py,
определяет переменную X, которая является глобальной только для программного кода в этом файле, и функцию, изменяющую глобальную переменную X
в этом файле:
X = 88 # Переменная X: глобальная только для этого файла
def f():
global X # Изменяет переменную X в этом файле
X = 99 # Имена в других модулях недоступны
Второй модуль, modb.py, определяет свою собственную глобальную перемен-
ную X, а также импортирует и вызывает функцию из первого модуля:
X = 11 # Переменная X: глобальная только для этого файла
import moda # Получает доступ к именам в модуле moda
moda.f() # Изменяет переменную moda.X, но не X в этом файле
print X, moda.X
При запуске этого модуля функция moda.f изменит переменную X в модуле moda, а не в modb. Глобальной областью видимости для функции moda.f всегда является файл, вмещающий ее, независимо от того, из какого модуля она была вызвана:
% python modb.py
11 99
Другими словами, операция импортирования никогда не изменяет область видимости для программного кода в импортируемом файле – из импортируемого файла нельзя получить доступ к именам в импортирующем файле. Если быть более точным:
Это поведение является частью понятия лексической области видимости –
в языке Python области видимости, доступные части программного кода полностью определяются физическим расположением этого программного кода
в файле. Области видимости не подвержены влияниям вызовов функций или
операции импортирования.
Например, рассмотрим два следующих простых модуля. Первый, в файле moda.py,
определяет переменную X, которая является глобальной только для программного кода в этом файле, и функцию, изменяющую глобальную переменную X
в этом файле:
X = 88 # Переменная X: глобальная только для этого файла
def f():
global X # Изменяет переменную X в этом файле
X = 99 # Имена в других модулях недоступны
Второй модуль, modb.py, определяет свою собственную глобальную перемен-
ную X, а также импортирует и вызывает функцию из первого модуля:
X = 11 # Переменная X: глобальная только для этого файла
import moda # Получает доступ к именам в модуле moda
moda.f() # Изменяет переменную moda.X, но не X в этом файле
print X, moda.X
При запуске этого модуля функция moda.f изменит переменную X в модуле moda, а не в modb. Глобальной областью видимости для функции moda.f всегда является файл, вмещающий ее, независимо от того, из какого модуля она была вызвана:
% python modb.py
11 99
Другими словами, операция импортирования никогда не изменяет область видимости для программного кода в импортируемом файле – из импортируемого файла нельзя получить доступ к именам в импортирующем файле. Если быть более точным:
- Функциям никогда не будут доступны имена, определенные в других функциях, если только они физически не вложены друг в друга.
- Программному коду модуля никогда не будут доступны имена, определенные в других модулях, если только они явно не были импортированы.
Это поведение является частью понятия лексической области видимости –
в языке Python области видимости, доступные части программного кода полностью определяются физическим расположением этого программного кода
в файле. Области видимости не подвержены влияниям вызовов функций или
операции импортирования.
В данную тему можно также добавить и пакеты.
ОтветитьУдалить-----------------------------------------------------------------
https://vk.com/pythoncom
пакеты в будущих статьях будут
УдалитьА как Вам уроки Орленко по питону? - https://www.youtube.com/playlist?list=PLvItDmb0sZw8RfG5odrtstiYkmiPg_Yo_
ОтветитьУдалитьКак то не профессионально он объясняет.
Удалить