根据文档 https://docs.python.org/3/reference/executionmodel.html#binding-of-names,
如果名称绑定在块中,则它是该块的局部变量,除非声明为非局部或全局变量。
在你的第一个代码块中,a
不绑定到你的任何东西class Bar
定义,因此它不是该块的局部变量。
绑定名称的一种方法是在赋值语句的左侧使用它。这是一个例子。
a = 1
def foo():
a = 2
class Bar:
b = a
a = 3
print(Bar.b)
foo()
Result:
1
这演示了“在全局命名空间中查找未绑定的局部变量”的原理——b = a
使用全局的值a
而不是其价值a
本地到foo
.
在你的第二个例子中,a
is被认为是本地的class Bar
块,因为为了确定名称的范围,“del 语句中出现的目标也被视为绑定”。但是“在全局命名空间中查找未绑定的局部变量”是不相关的,因为del
不需要查找名称的值来解除绑定。
为了更好地衡量,我们可以通过实验证实del
语句向解释器发出信号,表明名称应被视为本地名称。
a = 1
def foo():
a = 2
class Bar:
print(a)
del a
foo()
Result:
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
无法删除未绑定的局部变量。