def square():
print(a)
a = 10
b = a*a
return b
a = 2
print(square())
UnboundLocalError:分配前引用的局部变量“a”
def square():
print(a)
#a = 10
b = a*a
return b
a = 2
print(square())
我只是想确定为什么第二种情况是正确的,而第一种情况是错误的。
函数的执行引入了一个新的符号表,用于函数的局部变量。更准确地说,函数中的所有变量赋值都将值存储在本地符号表中;而变量引用首先在局部符号表中查找,然后在封闭函数的局部符号表中查找,然后在全局符号表中查找,最后在内置名称表中查找。
当解释器通过函数的定义时,它会创建一个符号表。它首先将“a”视为全局(由于 print(a)),然后在本地符号表中创建“a”(由于赋值)。
因此,在实际执行函数时,'a' 是一个没有绑定的局部变量。因此错误。
我对符号表的推理是否正确?
更新:分配后添加全局:
def square():
print(a)
a = 10
b = a*a
global a
return b
a = 2
print(square())
print(a)
语句是否从函数的本地符号表中global a
删除名称?'a'
square