В чем разница в обработке несвязанных локальных переменных в функциях и классах?Python

Программы на Python
Anonymous
В чем разница в обработке несвязанных локальных переменных в функциях и классах?

Сообщение Anonymous »

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

Код: Выделить всё

x = 10
class Foo():
x = x + 1

print(Foo.x)  # prints 11
Против:

Код: Выделить всё

x = 10
def faa():
x = x + 1

faa()  # raises UnboundLocalError
В модели выполнения Python это описывается так:

Определение класса — это исполняемый оператор, который может использовать и определять
имена. Эти ссылки следуют обычным правилам разрешения имен
за исключением того, что несвязанные локальные переменные просматриваются в
глобальном пространстве имен.

Но почему?
Единственный другой совет, с которым я столкнулся, это следующий бит:

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

Это по-прежнему не дает объяснения, почему это должно иметь следствием то, что несвязанные локальные значения ищутся в глобальном пространстве имен.
Обе ссылки взяты из этого ответа, в котором, однако, не рассматривается причина более подробно.

Подробнее здесь: https://stackoverflow.com/questions/486 ... us-classes

Вернуться в «Python»