globe = 10
def rdOnly():
print globe
big = 50
def rdInner():
print globe
print big
rdInner()
rdOnly()
def wrOnly():
global globe
print globe
globe = 100
print globe
big = 50
def wrInner():
global globe
print globe
globe = 200
print globe
print big
big = 500
print big
wrInner()
wrOnly()
这段代码中, 只读代码始终不会出错, 但是一旦对上层变量赋值或修改, 就会报错, 全局变量可以通过在每一层声明其变量全局性解决, 上层函数的局部变量就没有办法处理了?
求问这种问题如何解决, 以及为什么会发生这种问题, 内在机理是什么?即为什么只读时引用上层变量不会保存, 而修改时就会出现reference before define的问题?
python在执行函数之前,会预先处理函数。在这个过程中,会判断函数里的变量是局部变量,还是全局变量。如果出现赋值语句,比如globe = 200,它就认为globe是这个函数里的局部变量(前提是没有global globe),而不管这个语句出现在哪个位置,之后执行函数时,如果对globe 的操作出现在赋值语句之前,它会认为你这个局部变量还没有定义就开始使用,所以会出现reference before define的问题。而如果没有赋值语句时,它就会认为这个变量的定义不在这个函数里面,之后一切按闭包处理,在你这个例子里,它会向上找globe,找到了就可以正常使用。
解决的话,在每个函数重新声明一个变量,把上层的变量的值赋给它。