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
?
答案 0 :(得分:0)
这是一个范围问题。请检查此答案:https://stackoverflow.com/a/293097/1741450
可以访问除本地函数变量之外的作用域中的变量,但如果没有进一步的语法,则无法将其重新转换为新参数。相反,赋值将创建一个新的局部变量,而不是影响父范围中的变量。
第一个例子是错误的,因为无法修改。