В чем разница в обработке несвязанных локальных переменных в функциях и классах?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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