何时在Python中创建符号表

时间:2013-10-14 08:05:19

标签: python python-3.x symbol-table

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

1 个答案:

答案 0 :(得分:0)

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

  

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

第一个例子是错误的,因为无法修改。