По документам ,
если имя связано в блоке, оно является локальной переменной этого блока, если только оно не объявлено как нелокальное или глобальное.
В вашем первом кодовом блоке a
не привязан ни к чему в вашем определении class Bar
, поэтому он не является локальной переменной этого блока.
Одним из способов привязки имени является использование его в левой части оператора присваивания. Вот пример.
a = 1
def foo():
a = 2
class Bar:
b = a
a = 3
print(Bar.b)
foo()
Результат:
1
Это демонстрирует принцип «поиск несвязанных локальных переменных в глобальном пространстве имен» - b = a
использует значение глобального a
, а не значение a
local для foo
.
Во втором примере a
считается локальным по отношению к блоку class Bar
, поскольку "цель, встречающаяся в операторе del, также считается связанной" с целью определения области действия имени. Но «поиск несвязанных локальных переменных в глобальном пространстве имен» не имеет значения, так как del
не нужно искать значение имени для его отмены.
Для большей достоверности мы можем экспериментально подтвердить, что оператор del
сообщает интерпретатору, что имя следует считать локальным.
a = 1
def foo():
a = 2
class Bar:
print(a)
del a
foo()
Результат:
1
Traceback (most recent call last):
File "C:\Users\Kevin\Desktop\test.py", line 7, in <module>
foo()
File "C:\Users\Kevin\Desktop\test.py", line 4, in foo
class Bar:
File "C:\Users\Kevin\Desktop\test.py", line 6, in Bar
del a
NameError: name 'a' is not defined
Здесь мы видим, что print(a)
успешно ищет значение локальной переменной a
, а затем на следующей строке вылетает, потому что del
не может удалить несвязанную локальную переменную.