Код: Выделить всё
x = 10
class Foo():
x = x + 1
print(Foo.x) # prints 11
Код: Выделить всё
x = 10
def faa():
x = x + 1
faa() # raises UnboundLocalError
Определение класса — это исполняемый оператор, который может использовать и определять
имена. Эти ссылки следуют обычным правилам разрешения имен
за исключением того, что несвязанные локальные переменные просматриваются в
глобальном пространстве имен.
Но почему?
Единственный другой совет, с которым я столкнулся, это следующий бит:
Набор класса затем выполняется в новом кадре выполнения (см.
раздел Именование и привязка), используя вновь созданное локальное пространство имен и
исходное глобальное пространство имен. (Обычно набор содержит только
определения функций.) Когда набор класса завершает выполнение, его
фрейм выполнения удаляется, но локальное пространство имен сохраняется. 4 Затем создается
объект класса с использованием списка наследования для базовых
классов и сохраненного локального пространства имен для словаря атрибутов.
Это по-прежнему не дает объяснения, почему это должно иметь следствием то, что несвязанные локальные значения ищутся в глобальном пространстве имен.
Обе ссылки взяты из этого ответа, в котором, однако, не рассматривается причина более подробно.
Подробнее здесь: https://stackoverflow.com/questions/486 ... us-classes
Мобильная версия