0
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

4

1 回答 1

0

这是一个范围问题。检查这个答案:https ://stackoverflow.com/a/293097/1741450

可以访问除局部函数变量之外的范围内的变量,但如果没有进一步的语法,则不能将其重新绑定到新参数。相反,赋值将创建一个新的局部变量,而不是影响父作用域中的变量。

第一个例子是错误的,因为 a 不能被修改。

于 2013-10-14T08:21:18.690 回答