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是全局的(由于打印(A)),然后在本地符号表中创建'a‘(由于赋值)。
因此,在实际执行函数时,'a‘是一个没有绑定的局部。因此出现了错误。
我对符号表的推理正确吗??
更新:在分配后添加全局:
def square():
print(a)
a = 10
b = a*a
global a
return b
a = 2
print(square())
print(a)global a语句是否从square函数的本地符号表中删除名称'a'?
发布于 2013-10-14 08:21:18
这是范围问题。检查这个答案:https://stackoverflow.com/a/293097/1741450
可以访问局部函数变量以外的作用域中的变量,但如果没有进一步的语法,则不能返回到新参数。相反,赋值将创建一个新的局部变量,而不是影响父作用域中的变量。
第一个例子是错误的,因为a不能修改。
https://stackoverflow.com/questions/19355848
复制相似问题