Python решает ваши переменные с - вообще - тремя доступными пространствами имен.
В любое время во время выполнения есть как минимум три вложенных области, пространства имён которых доступны напрямую: самая внутренняя область поиска, которая сначала выполняется, содержит локальные имена; пространства имен любых закрывающих функций, поиск которых начинается с ближайшей охватывающей области; средняя область поиска, следующая по следующему, содержит глобальные имена текущего модуля; и самая внешняя область (поиск последней) - это пространство имен, содержащее встроенные имена.
Существуют две функции:
globals
иlocals
, которые показывают вам содержимое двух из этих пространств имен.Пространства имен создаются пакетами, модулями, классами, конструкцией объектов и функциями. Других ароматов пространств имен нет.
В этом случае вызов функции с именем
x
должен быть разрешен в локальном пространстве имен или в глобальном пространстве имен.Локальный в этом случае является телом функция метода
Foo.spam
.Глобальный - это хорошо глобальный.
Правило состоит в том, чтобы искать вложенные локальные пространства, созданные функциями метода (и определениями вложенных функций), а затем искать глобальные. Вот и все.
Нет других областей. Оператор
for
(и другие составные операторы, такие какif
иtry
) не создают новые вложенные области. Только определения (пакеты, модули, функции, классы и экземпляры объектов.)Внутри определения класса имена являются частью пространства имен классов.
code2
, например, должно быть квалифицировано именем класса. ОбычноFoo.code2
. Тем не менее,self.code2
также будет работать, потому что объекты Python смотрят на содержащийся класс как на обратную сторону.Объект (экземпляр класса) имеет переменные экземпляра. Эти имена находятся в пространстве имен объекта. Они должны быть квалифицированы объектом. (
variable.instance
.)Из метода класса вы имеете локальные и глобальные переменные. Вы говорите
self.variable
, чтобы выбрать экземпляр как пространство имен. Вы заметите, чтоself
является аргументом для каждой функции-члена класса, делая его частью локального пространства имен.См. Правила области Python , Область Python , Диапазон переменных .